私は自分のアプリケーションで多くのAsyncTaskクラスを使用しています。私はいつもそれらを使用して起動します:Android - ThreadPoolExecutorがキュー制限に達したかどうかを確認する方法
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
asyncTask.execute();
}
最近RejectedExecutionException例外が発生しました。私はこれについて読んで、なぜこれが起こるか(スレッドプールエグゼキュータがそのキューに持つことができるタスクの最大数を超えている)を理解する。
しかし、私はこれを避けるために、スレッドプールエグゼキュータに空きスロットがあるかどうかを確認する方法についてはどこにも読んでいませんでした。私がasyncTask.execute()をテストしたものから;メソッドにはこの制限がありません。
だから私はこのような何かを探しています:API 9までの後方互換性でこれを実装する方法の
if(executorCanHandlerAnotherQueue()){
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
asyncTask.execute();
}
}
else{
asyncTask.execute();
}
任意のアイデア?
あなたのレスポンスに感謝しますが、それは問題ではありませんでした。私はすでにこれを知っています。私が探しているのは、 'boolean canExecutorAddAnotherQueue()'のようなメソッドのタイプで、Executorスレッドプールに自分のasyncTaskを追加できるかどうかを判断するために使用します。 – Anonymous
私の更新された答えを見てください。あなたのケースのカスタムハンドラ。 – Ken
あなたが書いた方法はもっとよく似ています。キャッチしようとすると貧弱なアプローチ...しかし、私はカスタムThreadPoolExecutorを使用しません。 AsyncTaskはそれ自身のものを使用します。したがって、MAX_QUEUE_SIZE_YOU_DEFINEDは、AsyncTaskが定義するMAX_QUEUE_SIZE_YOU_DEFINEDです。どちらが私が理解しているから、デバイスのコアの数に依存します。デバイス上でテストすると、getQueueSize()が128の場合に例外がスローされることがわかりましたが、APIを使用してその番号を取得する方法はわかりません。 – Anonymous