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();
                    }

                });
        }

    };

IN ICS:大约 10 次后,它不再更新。你能给我一个演示,这样我就可以通过一些严格的测试,比如: MainActivity: open(), close(), ...

PS myAsyncTask.executeOnExecutor(MyAsyncTask.SERIAL_EXECUTOR, [params] ); 将工作?

4

1 回答 1

0

首先,您每 500 毫秒分叉一个新线程。在任何操作系统上,在任何编程语言中,这都非常糟糕。

其次,您正在分叉另一个线程(您的TimerTask),即将消息发回主应用程序线程,即转身并分叉AsyncTask. 这是没有意义的。

如果您要使用 a TimerTask,只需retrieveStatus()从您的run()方法调用,然后用于在主应用程序线程上runOnUiThread()执行。updateStatusUi()现在您只使用一个后台线程 (the TimerTask) 并引入更少的开销来实现相同的目的。

或者,考虑实现自己的ScheduledExecutorService而不是使用TimerTask.

于 2012-07-28T14:23:51.360 回答