【问题标题】:Retry AsyncTask重试异步任务
【发布时间】:2016-05-26 11:53:07
【问题描述】:

例如我有以下 AsyncTask:

  private class MyAsyncTask extends AsyncTask<Void, Void, Boolean> {


     @Override
     protected Void doInBackground(Void... params) {
         try {
             //some code that may throws exception
             return true;
         } catch (IOException ex) {
             return false;
         }
     }


     @Override
     protected void onPostExecute(Boolean param){
        if (!param) {
           AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);
           builder.setMessage("Error");
           builder.setPositiveButton("Retry", new DialogInterface.OnClickListener() {
              public void onClick(DialogInterface dialog, int which) {
                  //I want to retry MyAsyncTask here
              } 
           });
           builder.setNegativeButton("Exit", new DialogInterface.OnClickListener() {
              public void onClick(DialogInterface dialog, int which) {
                 finish();
              } 
           });
           AlertDialog alert = builder.create();
           alert.show();
        }
     }
  }

执行此操作的最佳做​​法是什么?我怕递归这段代码。

【问题讨论】:

  • 在这里使用 Handler 和 Thread 模式,年轻的 skywa1ker

标签: android


【解决方案1】:

您不能严格“重试”AsyncTask 的实例。您必须创建一个新实例并执行它,就像您执行第一个实例一样。您应该不会遇到递归问题。

【讨论】:

    【解决方案2】:

    我在doInBackground() 内重试代码 x 次:

     @Override
     protected Void doInBackground(Void... params)
     {
        final int MAX_RETRY=3;
        int iLoop;
        boolean bSuccess=true;
        for (iLoop=0; iLoop<MAX_RETRY; iLoop++)
        {
            try
            {
                //do some code that throw an exception
    
                //success! exit loop
                iLoop=0;
                break;
            }
            catch (IOException ex)
            {
                bSuccess=false;
            }
        }
        if (iLoop==(MAX_RETRY-1))
        {
            bSuccess=false;
        }
        return bSuccess;
     }
    

    这也是布尔值的两个值不足以衡量成功的情况之一。您可以将 bSuccess 替换为枚举,以获得第三个成功衡量标准:稍后重试。

    【讨论】:

      【解决方案3】:

      我使用BetterASyncTask 解决了同样的问题。

      它提供了方便的 HandleError 抽象方法,它允许我在 UI 线程上捕获异常并决定是否重试以及如何重试。

      【讨论】:

      • 谢谢!非常有用的课程。
      【解决方案4】:

      请查看retryableasynctask 看看是否有帮助。

      用法:

      // Params, Progress and Result could be anything, same as a regular AsyncTask
      new RetryableAsyncTask<Params, Progress, Result>(myActivity) {
        @Override
        protected void onPreExecute() {
          // write some code here
        }
      
        @Override
        protected Result doInBackground(Params... params) {
          // execute some expensive task here with your params
          // eg: MyExpensiveTask with method called 'get'
      
          return MyExpensiveTask.get(params);
        }
      
        @Override
        protected void onPostExecute(Result result) {
          // write some code here with your result
        }
      }.execute(myParams);
      

      覆盖“onError”行为

      默认情况下,onError 方法显示一个对话框“取消”和“重试”按钮选项。但是,当出现问题时,您可能想做其他事情。为此,请使用您自己的错误处理覆盖 onError。

      // Params, Progress and Result could be anything, same as a regular AsyncTask  
      new RetryableAsyncTask<Params, Progress, Result>(myActivity) {
        // ...
      
        @Override
        protected void onError(Throwable error, final Params... params) {
          // write your own error handling
        }
      }.execute(myParams);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-30
        • 1970-01-01
        • 2012-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多