2011-03-17 47 views
3

,比如我有以下的AsyncTask:重试的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(); 
     } 
    } 
    } 

什么是做到这一点的最佳做法?我害怕这个代码递归。

+6

使用处理程序和线程模式thingy在这里,年轻的skywa1ker – Reno 2011-03-17 08:25:06

回答

7

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

1

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

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

+0

谢谢!真正有帮助的分类。 – skywa1ker 2011-04-01 11:06:53

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以获得第三个成功度量:稍后重试。

0

请看看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);