2012-03-02 7 views
1

は、私はdoInBackgroundメソッドではと私がNull値をキャッチし、そのヌル値例外の内側に私は再び同じものを実行してみた場合、私はクイックAsyncTask doInBackgroun Q

new CommentList().execute(url); 

を実行していると言う:

new CommentList().execute(url); 

最初の実行を停止しますか?

は、私がこれを行うことができます。

if (result == null) { 
    cancel(true);       
    } 

@Override 
    protected void onCancelled() { 
     new CommentList().execute(commentlinkurl); 
    } 

は基本的に私はそれがキャンセルされます場合onPostExecuteを実行する必要はありません。

答えて

1

これはお勧めできません。非UIスレッド(doInBackgroundメソッド内)から新しいタスクを作成するべきではありません。 docsから

このクラスが正しく動作するため が従わなければならないいくつかのスレッドのルールがあります。

  • タスクインスタンスは、UIスレッド上で作成する必要があります。
  • UIスレッドでexecute(Params ...)を呼び出す必要があります。
  • onPreExecute()、onPostExecute(Result)、doInBackground(Params ...)、onProgressUpdate(Progress ...)を手動で呼び出さないでください。 (第二の実行が試行された場合、例外がスローされます)
  • タスクは一度だけ実行することができ

編集コメントに基づいて: ただしonPostExecute内のタスクを再起動することができますかonCancelled方法。あなたは、単にdoInBackgroundからそれにいくつかの特定の結果を返すか、さらにそれを分析するためにAsyncTaskのメンバ変数であなたのThrowableを保存することができます:

protected void onPostExecute(Something something) { 
    if(something == null){ 
     // safe to start new execute task here 
    } 
    // or 
    if(mException instanceof TemporaryIssueException){ 
     // safe to start new execute task here 
    } 
} 
+0

+1が、おそらく、 'onPostExecute(...)に関連した結果を返す'と作成します新しいインスタンスとそこからの実行はOKです。 – Squonk

+0

さて、私の編集が見えますか? –

+0

ありがとうございます、あなたのコメントに基づいて私の答えを更新しました。 – Dmitry