我的Android应用程序必须处理到达的消息,这些消息经常串联(特别是在片状连接期间).我在AsyncTasks中处理这些传入的消息,这样我就不会干扰UI线程.如果一次收到太多消息,我会得到一个RejectedExecutionException.我的错误堆栈如下所示:
10-22 14:44:49.398: E/AndroidRuntime(17834): Caused by: java.util.concurrent.RejectedExecutionException: Task android.os.AsyncTask$3@414cbe68 rejected from java.util.concurrent.ThreadPoolExecutor@412716b8[Running, pool size = 128, active threads = 22, queued tasks = 0, completed tasks = 1323]
10-22 14:44:49.398: E/AndroidRuntime(17834): at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1967)
10-22 14:44:49.398: E/AndroidRuntime(17834): at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:782)
10-22 14:44:49.398: E/AndroidRuntime(17834): at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1303)
10-22 14:44:49.398: E/AndroidRuntime(17834): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:564)
Run Code Online (Sandbox Code Playgroud)
我正在运行任务,task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)以便并行处理传入的消息.
令人困惑的是,与我能找到的相关StackOverflow问题(例如此处和此处)不同的是,活动线程和排队任务的数量似乎没有超出限制(似乎是128)和10,分别).查看stacktrace:
ThreadPoolExecutor@412716b8[Running, pool size = 128, active threads = 22, queued tasks = 0, completed tasks = 1323]
为什么我会收到此错误消息?
我有一个应用程序,当用户要求过滤图像时会生成一个新线程.
这是我所拥有的唯一类型的任务,并且所有任务都同等重要.
如果我要求太多并发线程(我想要的最大值是9),线程管理器会抛出RejectedExecutionException.
在那一刻,我所做的是;
// Manage Concurrent Tasks
private Queue<AsyncTask<Bitmap,Integer,Integer>> tasks = new LinkedList<AsyncTask<Bitmap,Integer,Integer>>();
@Override
public int remainingSize() {
return tasks.size();
}
@Override
public void addTask(AsyncTask<Bitmap, Integer, Integer> task) {
try{
task.execute(currentThumbnail);
while(!tasks.isEmpty()){
task = tasks.remove();
task.execute(currentThumbnail);
}
} catch (RejectedExecutionException r){
Log.i(TAG,"Caught RejectedExecutionException Exception - Adding task to Queue");
tasks.add(task);
}
}
Run Code Online (Sandbox Code Playgroud)
只需将被拒绝的任务添加到队列中,下次启动线程时,将检查队列以查看是否存在待办事项.
显而易见的问题是,如果最终任务在第一次尝试时被拒绝,它将永远不会重新启动(直到它不再需要它之后).
只是想知道我是否应该使用一个简单的模型来管理这类事情.我需要任务在完成后通知队列,所以我知道有空间,但我不确定如何.
亲切的问候,
加文
android异步任务是否缓慢或我做错了什么?
这就是我做的
Log.e("Filler", "before");
new DownloadListContent().execute("string");
Log.e("Filler", "after");
Run Code Online (Sandbox Code Playgroud)
和DownloadListContent()..
class DownloadListContent extends AsyncTask<Object, Object, Object> {
protected Void doInBackground(Object... urls) {
Log.e("Filler", "Am in doInBackground");
....
}
Run Code Online (Sandbox Code Playgroud)
这是logCat.
03-15 23:18:**47**.598: E/Filler(17150): before
03-15 23:18:**47**.598: E/Filler(17150): after
03-15 23:18:**59**.789: E/Filler(17150): Am in doInBackground
Run Code Online (Sandbox Code Playgroud)
那是在背景发生前12秒.为什么会这样?
在平均时间我有其他情况下其他类的AsyncTask的做一些其他的网络工作.AsyncTask会影响另一个吗?
我真的无法想出那一个!
UPDATE
谢谢你的意见.似乎async对同时运行多少个线程有一个硬性限制.如果您必须同时下载一堆图像与数据,这是一个杀手.
遵循CommonsWare的方法,我可以分离asyncTask的类型,以便一种类型(图像)不会阻止其他类型(列表数据).