2011-03-17 43 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);