相关疑难解决方法(0)

来自AsyncTask的RejectedExecutionException,但没有达到限制

我的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]

为什么我会收到此错误消息?

multithreading android

17
推荐指数
2
解决办法
2万
查看次数

简单的线程管理 - Java - Android

我有一个应用程序,当用户要求过滤图像时会生成一个新线程.

这是我所拥有的唯一类型的任务,并且所有任务都同等重要.

如果我要求太多并发线程(我想要的最大值是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)

只需将被拒绝的任务添加到队列中,下次启动线程时,将检查队列以查看是否存在待办事项.

显而易见的问题是,如果最终任务在第一次尝试时被拒绝,它将永远不会重新启动(直到它不再需要它之后).

只是想知道我是否应该使用一个简单的模型来管理这类事情.我需要任务在完成后通知队列,所以我知道有空间,但我不确定如何.

亲切的问候,

加文

java multithreading android

8
推荐指数
1
解决办法
1万
查看次数

android异步任务是否缓慢?

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的类型,以便一种类型(图像)不会阻止其他类型(列表数据).

java android android-asynctask

2
推荐指数
1
解决办法
5401
查看次数

标签 统计

android ×3

java ×2

multithreading ×2

android-asynctask ×1