0

以下のような AsyncTask があります。

private class SearchTask extends AsyncTask<Object, Object, Object> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        System.out.println("Start");
    }

    @Override
    protected Object doInBackground(Object... urls) {
        SearchFunction();
        return null;
    }

    @Override
    protected void onPostExecute(Object result) {
        System.out.println("End");
    }
}

そして、以下のようなタイマー:

private Handler handler = new Handler();
private Runnable updateTimer = new Runnable() {
    public void run() {
        System.out.println("===status===");
        System.out.println(SearchTask.getStatus());

        SearchTask.cancel(true);
    handler.postDelayed(updateTimer, 3000);
    }
};

そして、以下のように AsyncTask とタイマー コードを呼び出します。

            handler.postDelayed(updateTimer, 3000);
            SearchTask SearchTask = new SearchTask();
            SearchTask.execute();

doInBackground の SearchFunction メソッドは 3 秒以上かかる可能性があるため、タイマーを追加します。
しかし、updateTimer で最初に AsyncTask を呼び出してキャンセルすると、doInBackground は終了するまで実行され続け、その後 onPostExecute をキャンセルします。
doInBackground ダイレクトをキャンセルするにはどうすればよいですか?

4

2 に答える 2

1

たまに isCancelled() をチェックして試してみてください。

protected Object doInBackground(Object... x) {
    while (/* condition */) {
      // work...
      if (isCancelled()) break;
    }
    return null;
}
于 2013-08-07T07:36:29.597 に答える
1

基本的にそれはできません。最善の方法はcancel(true)、で実行されているコードを無視することを意味するように設定することですonPostExecute()(おそらくifそこにステートメントを配置します)。お役に立てれば。

于 2013-08-07T07:35:30.650 に答える