Android AsyncTask不调用doInBackground方法

Android AsyncTask不调用doInBackground方法,android,android-asynctask,Android,Android Asynctask,这是我的密码: new Loading.LoadTast(ctx) { @Override protected String doInBackground(Integer... params) { Looper.prepare(); String msg=changePwd(); closeProgressDialog();

这是我的密码:

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);
    }
}
new Loading.LoadTast(ctx){
@凌驾
受保护字符串doInBackground(整数…参数){
Looper.prepare();
字符串msg=changePwd();
closeProgressDialog();
如果(msg==null){
SmartNgApplication.getInstance().exit();
}否则{
BaseHelper.showtoos(ctx,msg);
}
loop.loop();
返回null;
}
}.execute();
公共抽象静态类LoadTast扩展了AsyncTask{
私有进程对话;
私有上下文ctx;
公共LoadTast(上下文ctx){
这个.ctx=ctx;
}
受保护的抽象字符串doInBackground(整数…参数);
公共无效onPreExecute(){
super.onPreExecute();
progressDialog=progressDialog.show(ctx,“,”加载…”,true,false);
}
public void onPostExecute(字符串结果){
super.onPostExecute(结果);
progressDialog.disclose();
BaseHelper.showtoos(ctx,result);
}
}
单击按钮以运行该方法。单击它5次
AsyncTask.onPreExecute
会被调用,但不会调用
doInBackground
,因此屏幕仍然显示一个对话框

我认为
AsyncTask
THREAD\u POOL\u EXECUTOR

  • 您不应该在doInBackground中调用任何UI更改方法。这就是onPostExecute的作用。仅在doInBackground中的UI线程上执行不允许的操作

  • 要检查为什么不调用doInBackground,请尝试将实现(来自匿名内部类)放入LoadTast,看看是否调用了它

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

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

    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);
      }
    
    }
    
    公共抽象类AsyncTaskWrapper
    扩展异步任务{
    @凌驾
    最终保护结果doInBackground(参数…参数){
    返回wrappedDoInBackground(参数);
    }
    受保护的抽象结果包装背景(Params…Params);
    受保护的抽象无效wrappedOnPostExecute(结果);
    最终受保护的void onPostExecute(结果){
    wrappedOnPostExecute(结果);
    }
    }
    
    正如托德·斯约兰德在《美国历史》中所说的那样

    多线程模型在2.3.5和4.0.4之间更改。异步任务 现在默认情况下,应用程序中的所有子类都使用相同的 线程(即一次只能运行一个异步任务!)。已经解释过了 在这里:

    首次引入时,AsyncTasks是在单个服务器上串行执行的 背景线程。从甜甜圈开始,它被改成了一个 允许多个任务并行运行的线程。从 蜂窝,任务在单个线程上执行,以避免常见的 并行执行导致的应用程序错误

    如果确实需要并行执行,可以调用 executeOnExecutor(java.util.concurrent.Executor,对象[])与 线程池执行器

    考虑到这一点,可能有另一个AsyncTask正在运行 您的应用程序,从而阻止此应用程序启动。那会 解释为什么它可以在2.3.5设备上正常工作,但不能在4.0.4设备上正常工作 平板电脑


    为什么覆盖
    doInBackground()
    方法如此重要?为什么不把它放在
    AsyncTask
    中呢?因为new Loading.LoadTast(ctx)在许多类中调用,我不想在不需要的每个类上都编写onPreExecute方法?创建类之后,只需调用
    newloadtast.execute([int params])此外,您需要声明
    异步任务
    将使用哪些变量,例如
    公共抽象静态类LoadTast扩展异步任务{
    对不起,在我的代码中有“Amen”。有关异步任务的更多信息,请参阅此博客帖子