1

ボタンを2回クリックすると、現在実行中のタスクがキャンセルされて再作成される検索タスクがあります。

if (_searchAsyncTask != null) {
    // cancel if already running
    _searchAsyncTask.cancel(true);
}
_searchAsyncTask = new SearchAsyncTask(this);
_searchAsyncTask.execute(data);

これは、元の非同期タスクを再度呼び出したかのように、上記のコードの最後の行で失敗しています。

java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)

私は何かが足りないのですか?元のインスタンスがisCancelled()になるまで待つ必要がありますか?

4

1 に答える 1

2

最近、バックグラウンドから再開するときに同様の例外が発生し、バックグラウンドに移行したときにタスクが途中で実行されていたという奇妙な問題が発生しました。これを修正するために AsyncTask.executeOnExecutor の使用に切り替えました (一部のコードは冗長である可能性があります)。

if (_searchAsyncTask == null) {
    _searchAsyncTask = new SearchAsyncTask();
}

if (mThreadExecutor != null && !mThreadExecutor.isShutdown()) {
    mThreadExecutor.shutdownNow();
}

if (mThreadExecutor == null || mThreadExecutor.isShutdown()) {
    mThreadExecutor = Executors.newSingleThreadExecutor();
}

if (_searchAsyncTask.getStatus() != Status.RUNNING) {
    _searchAsyncTask.executeOnExecutor(mThreadExecutor);
}

これは私の問題を解決しました。やってみたいかも…?

于 2012-09-11T23:51:49.563 に答える