【问题标题】:What is the best practice to use nested AsyncTasks?使用嵌套 AsyncTask 的最佳实践是什么?
【发布时间】:2017-11-28 09:43:22
【问题描述】:

在我的 Android 应用程序中,我有多达 4 个相互依赖的异步任务,这意味着必须先完成一项任务,然后下一项任务才能与检索到的数据一起执行。现在,当代码看起来像这样时,这在某些时候可能会很不清楚:

final AsyncTask<Void, Void, Boolean> taskOne = new AsyncTask<Void, Void, Boolean>() {   
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        // retrieve required data   
        return true;
    }

    @Override
    protected void onPostExecute(Boolean success) {
        if (success) {
            // start second task here
            final AsyncTask<Void, Void, Boolean> taskTwo = new AsyncTask<Void, Void, Boolean>() {
                @Override
                protected void onPreExecute() {
                    super.onPreExecute();
                }

                @Override
                protected Boolean doInBackground(Void... params) {
                    // retrieve required data   
                    return true;
                }

                protected void onPostExecute(Boolean success) {
                    if (success) {
                        // start third task here
                        final AsyncTask<Void, Void, Boolean> taskThree = new AsyncTask<Void, Void, Boolean>() {
                            @Override
                            protected void onPreExecute() {
                                super.onPreExecute();
                            }

                            @Override
                            protected Boolean doInBackground(Void... params) {
                                // retrieve required data   
                                return true;
                            }

                            protected void onPostExecute(Boolean success) {
                                if (success) {
                                    // and so on ...
                                }
                            }
                        }

                        taskThree.execute();
                    }
                }
            }

            taskTwo.execute();
        }
    }
}

taskOne.execute();

使用更具可读性的代码实现此行为的最佳做法是什么?

提前致谢

【问题讨论】:

  • 创建三个单独的类,在 onPostExecute() 中你只需要调用另一个类,比如 new TaskTwo().execute()
  • 或者你可以只使用一个类,但是,根据你之前的响应,在构造函数中传递不同的参数。
  • 会建议你看看使用 RxJava 来做这样的事情。

标签: android android-asynctask nested readability


【解决方案1】:

TaskOne

Class TaskOne extends AsyncTask{

  onPostExecute(boolean success){
     if(success){
        new TaskTwo().execute();
     }
  }
}

任务二

Class TaskTwo extends AsyncTask{

  onPostExecute(boolean success){
     if(success){
        new TaskThree().execute();
     }
  }
}

任务三

Class TaskThree extends AsyncTask{

      onPostExecute(boolean success){
         if(success){
            //do something
         }
      }
}

【讨论】:

  • 我最终使用了您的方法,并且它的工作方式与应有的一样。感谢您的快速帮助!
【解决方案2】:

我认为您应该使用 Interface 崩溃。在您的情况下,它称为侦听器或回调。我没有测试代码。但看起来是这样的

    Class A extend Activity implement ServerRequestListener{


          public ServerRequestListener listener;

          @Override 
          onCreate (Bundle bundle){
               listener = this;
               doTaskOne();
          }

          public void doTaskOne(){
               final AsyncTask<Void, Void, Boolean> taskOne = new AsyncTask<Void, Void, Boolean>() {   
                     @Override
                     protected void onPreExecute() {
                         super.onPreExecute();
                     }

                     @Override
                     protected Boolean doInBackground(Void... params) {
                         // retrieve required data   
                         return true;
                     }

                     @Override
                     protected void onPostExecute(Boolean success) {
                         if (success) {
                             listener.onSuccess(new JSON());
                         }
                     }
            }

            taskOne.execute();

        }



         public interface ServerRequestListener {
               void onSuccess(Json);
               void onFailure(Error);
         }


         @Override
         onSuccess(Json json){
             //call second task
         }

         @Override
         onFailure(Error error){

         }

    }

【讨论】:

    猜你喜欢
    • 2014-01-23
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多