以下のような 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 ダイレクトをキャンセルするにはどうすればよいですか?