我得到了类似于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]);会工作吗?
答案 0 :(得分:0)
首先,你每隔500ms就要一个新线程。在任何操作系统上,任何编程语言都非常糟糕。
其次,您正在分支另一个线程(您的TimerTask
),即将消息发回主应用程序线程,即转向并分叉AsyncTask
。这毫无意义。
如果您要使用TimerTask
,只需通过retrieveStatus()
方法拨打run()
,然后使用runOnUiThread()
在主应用上执行updateStatusUi()
线。现在你只使用一个后台线程(TimerTask
)并且引入更少的开销来完成相同的目的。
或者,请考虑实施自己的ScheduledExecutorService
,而不是使用TimerTask
。