1

AsyncTask、RejectedExecutionException、および Task Limitに似たこれらの種類の例外が発生し、「コードを取得してパッケージに追加する」.

java.util.concurrent.RejectedExecutionException: タスク android.os. AsyncTask $3@416cd2e0 が java.util.concurrent.ThreadPoolExecutor@4101be78 から拒否されました [実行中、プール サイズ = 128、アクティブなスレッド = 128、キューに入れられたタスク = 10、完了したタスク = 53]

    updateTimer.schedule(updateTask, 500, 3000);

...

    updateTask = new TimerTask() {

        public void run()
        {
            updateHandler.sendMessage(msg);
        }

    };

...

    updateHandler = new Handler() {

        public void handleMessage(Message msg)
        {
            updateAsync();
        }

    };

...

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

        protected Void doInBackground(Void... params)
        {
            retrieveStatus();
            return null;
        }


        protected void onPostExecute(Void result)
        {
            super.onPostExecute(result);
            updateStatusUi();// !!!?

        }

    }.execute();

    updateTask = new TimerTask() {

        public void run()
        {
                retrieveStatus();
                getActivity().runOnUiThread(new Runnable() {

                    public void run()
                    {
                        updateStatusUi();
                    }

                });
        }

    };

ICS: 約 10 回後、それ以上更新されません。MainActivity: open(), close(), ... のような厳密なテストに合格できるように、デモをお願いできますか?

PS myAsyncTask.executeOnExecutor(MyAsyncTask.SERIAL_EXECUTOR, [params] ); 動作します?

4

1 に答える 1

0

まず、500ms ごとに新しいスレッドをフォークしています。これは、どのOSでも、どのプログラミング言語でも、本当に悪いことです。

2 番目に、さらに別のスレッド (あなたのTimerTask) をフォークしています。これは、メイン アプリケーション スレッドにメッセージを送り返し、方向転換して をフォークしていAsyncTaskます。これは無意味です。

を使用する場合はTimerTask、単にメソッドから呼び出しretrieveStatus()てから、 を使用してメイン アプリケーション スレッドで実行します。これで、1 つのバックグラウンド スレッド ( ) のみを使用して、同じ目的を達成するためのオーバーヘッドを大幅に削減できます。run()runOnUiThread()updateStatusUi()TimerTask

ScheduledExecutorServiceまたは、を使用する代わりに独自の実装を検討してくださいTimerTask

于 2012-07-28T14:23:51.360 に答える