ICS中的AsyncTask:java.util.concurrent.Rejected执行异常

时间:2012-07-28 14:10:05

标签: android concurrency android-asynctask

我得到了类似于AsyncTask, RejectedExecutionException and 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(),...

P.S。 myAsyncTask.executeOnExecutor(MyAsyncTask.SERIAL_EXECUTOR,[params]);会工作吗?

1 个答案:

答案 0 :(得分:0)

首先,你每隔500ms就要一个新线程。在任何操作系统上,任何编程语言都非常糟糕。

其次,您正在分支另一个线程(您的TimerTask),即将消息发回主应用程序线程,即转向并分叉AsyncTask。这毫无意义。

如果您要使用TimerTask,只需通过retrieveStatus()方法拨打run(),然后使用runOnUiThread()在主应用上执行updateStatusUi()线。现在你只使用一个后台线程(TimerTask)并且引入更少的开销来完成相同的目的。

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