2012-06-23 7 views
6

Android SDK v15が2.3.6デバイスで実行されています。キャンセル後にAsyncTask.onCancelled()が呼び出されない(true)

doInBackground()コールでcancel()を呼び出しているときに、onPostExecute()がまだ呼び出されているという問題が発生しています。

はここに私のコードです:私は、代わりにonCancelledのこれをテストするために例外をスローするsomeMethod()を強制しています

@Override 
public String doInBackground(String... params) { 
    try { 
     return someMethod(); 
    } catch (Exception e) { 
     cancel(true); 
    } 

    return null; 
} 

public String someMethod() throws Exception { 
    ... 
} 

呼ばれて、私はいつもonPostExecute()に戻ります。 isCancelled()をチェックすると、返された値がtrueになるので、cancel(true)が実行されていることがわかります。

アイデア?

答えて

6

onCancelledは、Android APIレベル11(Honeycomb 3.0.x)以降でのみサポートされています。つまり、Android 2.3.6デバイスでは、呼び出されません。

あなたの最善の策はonPostExecuteでこれを持っていることです:あなたはバージョンチェックを回避したい場合

protected void onPostExecute(...) { 
    if (isCancelled() && Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { 
     onCancelled(); 
    } else { 
     // Your normal onPostExecute code 
    } 
} 

は、あなたの代わりに行うことができます役立ちます

protected void onPostExecute(...) { 
    if (isCancelled()) { 
     customCancelMethod(); 
    } else { 
     // Your normal onPostExecute code 
    } 
} 
protected void onCancelled() { 
    customCancelMethod(); 
} 
protected void customCancelMethod() { 
    // Your cancel code 
} 

願っています! onCancelled(Object result)は、プラットフォームAPIレベルが11未満である場合、onCancelled()が起動され、そのためだけAPIレベル11以降に追加されていたが:) AndroidのAPIドキュメント、onCancelled()によれば

+1

これらはどちらも呼び出されません.... – Radu

+0

@Radu私はあなたが使っているコードや、あなたが達成しようとしているタスクについては分かりません。このようなことをやろうとしていて問題を受けている場合は、新しい質問を開始するのが最善でしょう。 – Eric

+0

私のポイントは、@ onCancelled(SomeTypeの結果)と単純なonCancelled()をオーバーライドできません。また、古いAndroidバージョンをターゲットにしている場合、onCancelled()はまったく呼び出されません。 – Radu

21

は、APIレベル3がある常にであり、onCancelled(Object)が呼び出されます。常にです。

したがって、すべてのAPIレベル3以上でコードを実行する場合は、両方の方法を実装する必要があります。あなたはisCancelled()を使用することができるようにインスタンス変数に結果を保存したい場合があり、同じ動作を持つためには、以下のように:ところで

public class MyTask extends AsyncTask<String, String, Boolean> { 
    private Boolean result; 
    // . . . 
    @Override 
    protected void onCancelled() { 
    handleOnCancelled(this.result); 
    } 
    @Override 
    protected void onCancelled(Boolean result) { 
    handleOnCancelled(result); 
    } 
    //Both the functions will call this function 
    private void handleOnCancelled(Boolean result) { 
    // actual code here 
    } 
} 

、エリックのコードがない可能性が高い仕事をしてAndroidのAPIドキュメントので、言う:

cancel()方法はdoInBackground(Object[]) 戻った後、UIスレッド上で呼び出されonCancelled(Object)になります呼び出します。 cancel()メソッドを呼び出すと、 onPostExecute(Object)が呼び出されないことが保証されます。

+0

それは私の一日を作る。 –

+1

丁寧な回答ですが、メソッド名にはタイプミスがあります。私はそれが "handleOnCancelled"であるべきだと思います。 – TonyQ

+1

cancel()メソッドを呼び出すと、onPostExecute(Object)が呼び出されないことが保証されます。ハニカムの場合のみ、それ以降のバージョンの場合は@eric answer –

関連する問題