2012-06-18 85 views
0

点击按钮来调用这个方法:的AsyncTask运行5次,然后无法运行doInBackground方法

private void goRegister(final boolean isUsername) { 
    new Loading.LoadTast(ctx) { 

     @Override 
     protected String doInBackground(Integer... params) { 
      Looper.prepare(); 
      String msg=doRegister(isUsername); 
      closeProgressDialog(); 
      if(msg == null || msg.length() == 0) { 
       SmartNgApplication.getInstance().exit(); 
      } else { 
       BaseHelper.showToast(ctx, msg); 
      } 
      Looper.loop(); 
      return null; 
     } 

    }.execute(); 
} 

,这是LoadTast类:

public abstract static class LoadTast extends AsyncTask <Integer, Integer, String > { 

    private ProgressDialog progressDialog; 

    private Context ctx; 

    public LoadTast(Context ctx) { 
     this.ctx=ctx; 
    } 

    protected abstract String doInBackground(Integer... params); 

    public void onPreExecute() { 
     super.onPreExecute(); 
     progressDialog=ProgressDialog.show(ctx, "", "loading...", true, false); 
    } 

    public void onPostExecute(String result) { 
     super.onPostExecute(result); 
     progressDialog.dismiss(); 
     BaseHelper.showToast(ctx, result); 
    } 

    public void closeProgressDialog() { 
     if(progressDialog != null) { 
      progressDialog.dismiss(); 
     } 
    } 
} 

我的计划是: 当我点击5次按钮不会调用doInbackground方法并且屏幕始终运行加载。我猜代码运行onPreExecute而不是运行doInbackground。为什么?? 在AsyncTask有一个线程池,CORE_POOL_SIZE=5。如何解决该方案,帮助我谢谢你!

回答

2

的AsyncTask是不应该来运行其doInBackground超过一次,而且它也不应该是一个糊涂的线程。

的AsyncTask应该是你运行一个一次性的事情,你只能假设,如果多个asyncTasks已经执行,至少有一个将在同一时间运行。

我注意到的另一件事:你从doInBackground中调用closeProgressDialog,但这是一个与UI相关的操作,而doInBackground正在非UI线程上运行。

+0

我删除closeProgressDialog在doInBackground代码运行良好 – Sunxc

+0

我不明白。它解决了你的问题吗?如果是这样,请勾选此答案。如果没有,请告诉我们什么是状态。正如我写的,asyncTask不应该被执行多次。如果您希望多次执行相同的任务,则必须创建多个任务实例。 –

0

我有这个问题我自己。我通过在thread pool中执行AsyncTasks而不是serial来解决这个问题。

要做到这一点,你必须打电话给你AsyncTasks这样的:

YourAsyncTask task = new YourAsyncTask(); 
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 

这应该解决你的问题。

相关问题