11

に問題がありAsyncTaskます。doInBackground()の後にメソッドが呼び出されないことがありonPreExecute()ます。

この質問が何度か聞かれたことは知っていますが、与えられた答えは私にはうまくいきません。

ここに私のコードの一部があります:

AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, Void>(){

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Log.e("AsyncTask", "onPreExecute");
    }

    @Override
    protected Void doInBackground(Void... params) {
        Log.e("AsyncTask", "doInBackground");
        return null;
    }

    protected void onPostExecute(Void result) {
        Log.e("AsyncTask", "onPostExecute");
    };

};

if(Build.VERSION.SDK_INT >= 11)
    asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
else
    asyncTask.execute();

ご覧のとおり、Android のバージョンが >= HoneyComb であるかどうかを確認し、true の場合は Pool Executor でタスクを実行します。その「トリック」でもdoInBackground()呼ばれないことがあります。

誰かが同じ問題を抱えているか、何が問題なのか知っていますか?

ありがとうございました

4

3 に答える 3

38

最後に、問題の解決策を見つけました。

*AsyncTask.THREAD_POOL_EXECUTOR* で asyncTask を実行する代わりに、大きな corePoolSize と maximumPoolSize で独自の ThreadPoolExecutor をインスタンス化します。

int corePoolSize = 60;
int maximumPoolSize = 80;
int keepAliveTime = 10;

BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>(maximumPoolSize);
Executor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue);

と ...

asyncTask.executeOnExecutor(threadPoolExecutor);

これが良いバグ修正かどうかはわかりませんが、これにより doInBackground() が常に呼び出されます。あなたが言ったように、問題は *AsyncTask.THREAD_POOL_EXECUTOR* が私が与えたほど多くの asyncTask を管理できなかったことだと思います。

君たちありがとう

于 2013-05-31T07:00:02.123 に答える
2

私のタスクの一部が でブロックされたことが原因で、私に一度起こりましたdoInBackground()(これは、貼り付けたコード サンプルでは明らかに不可能です)。

Android での THREAD_POOL_EXECUTOR のデフォルトのプール サイズは、前回確認したときは 5 でした。そのため、同時に 5 つ以上のタスクを実行すると、次のタスクはタスクが完了するまで待機します。

doInBackground()これは、私が知っている唯一のケースで、電話を防ぐことができました。

于 2013-05-30T09:51:20.563 に答える