8

2.3.6 デバイスで実行されている Android SDK v15。

通話中に電話onPostExecute()をかけているときに、 がまだ呼び出されているという問題があります。cancel()doInBackground()

これが私のコードです:

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

    return null;
}

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

これをテストするために強制的someMethod()に例外をスローし、onCancelled が呼び出される代わりに、常に に戻りonPostExecute()ます。戻り値が true であることを確認isCancelled()すると、それが実行されていることがわかりcancel(true)ます。

何か案は?

4

2 に答える 2

24

Android API ドキュメントによると、onCancelled()API レベル 3 から存在しますがonCancelled(Object result)、API レベル 11 からのみ追加されました。そのため、プラットフォーム API レベルが 11 未満の場合onCancelled()は常に呼び出され、それ以外の場合は常に呼び出さ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
  }
}

ところで、Eric のコードは、Android API のドキュメントに次のように記載されているため、機能しない可能性があります。

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

于 2012-12-13T01:03:24.177 に答える
7

onCancelledAndroid 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
}

お役に立てば幸いです。:)

于 2012-06-23T01:17:07.160 に答える