AsyncTask不会调用doInBackground方法

时间:2012-06-15 09:46:13

标签: android android-asynctask

这是我的代码:

new Loading.LoadTast(ctx) {

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


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);
    }
}

单击按钮以运行该方法。点击AsyncTask.onPreExecute 5次,但不会调用doInBackground,因此屏幕仍会显示对话框。

我认为AsyncTask THREAD_POOL_EXECUTOR

有问题

2 个答案:

答案 0 :(得分:2)

  1. 您不应该在doInBackground中调用任何UI更改方法。那就是onPostExecute的用途。只做doInBackground中UI线程上不允许的内容。

  2. 要检查为什么不调用doInBackground,请尝试将实现(从匿名内部类)放入LoadTast,看看它是否被调用。

  3. 我已经通过将子类调用重命名为onPostExecute和doInBackground来实现AsyncWrapper。应该可以在匿名内部类中覆盖包装的方法,就像您在示例中使用的那样。

  4. 这是简短版本。我的真实代码涉及一些通用异常处理,而不仅仅是对包装方法的调用。

    public abstract class AsyncTaskWrapper<Params, Progress, Result> 
      extends AsyncTask<Params, Progress, Result> {
    
      @Override
      final protected Result doInBackground(Params... params) {
        return wrappedDoInBackground(params);
      }
    
      protected abstract Result wrappedDoInBackground(Params... params);
    
      protected abstract void wrappedOnPostExecute(Result result);
    
      final protected void onPostExecute(Result result) {
    
        wrappedOnPostExecute(result);
      }
    
    }
    

答案 1 :(得分:1)

正如Todd Sjolander在this thread中所说的那样......

  

多线程模型在2.3.5和4.0.4之间变化。的AsyncTask   现在默认使用相同的应用程序中的所有子类   线程(即一次只能运行一个AsyncTask!)。它解释了   这里:

     

首次引入时,AsyncTasks在单个上串行执行   背景线程。从DONUT开始,这被改成了一个池   允许多个任务并行运行的线程。从...开始   HONEYCOMB,任务在单个线程上执行以避免常见   并行执行导致的应用程序错误。

     

如果您真的想要并行执行,可以调用   executeOnExecutor(java.util.concurrent.Executor,Object [])with   THREAD_POOL_EXECUTOR。

     

考虑到这一点,可能是另一个AsyncTask正在运行   你的应用程序,从而阻止这个开始。那会   解释为什么它在2.3.5设备上运行正常,但不是4.0.4   片剂。