我正在使用AsyncTasks来获取数据以响应用户按下按钮.这很好用并且在获取数据时保持接口响应,但是当我检查Eclipse调试器中发生了什么时,我发现每次AsyncTask创建一个新的(这通常是因为它们只能使用一次),正在创建一个新线程,但从未终止.
结果是大量的AsyncTask线程就坐在那里.我不确定这在实践中是否是一个问题,但我真的想摆脱那些额外的线程.
我怎么能杀死这些线程?
我的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]
为什么我会收到此错误消息?
我正在使用asyncTasks,用图像加载列表元素(只需按照android的有效加载位图的教程)
在DDMS中,我可以看到最多5个AsyncTasks正在运行
此外,我还添加了另一个AsyncTask,它使用MediaCodec类执行一些解码.
现在在DDMS中,我仍然看到5个AsyncTasks,我的图像加载aynctask或解码异步任务执行,而不是两个.
当解码正在运行时,如果我滚动列表,元素的图像不会更新当我通过调用它的执行方法启动新的解码asynctask时,解码不会启动,但如果我现在滚动列表视图,图像会更新.
那么AsyncTask是否有限制?
即使在listAdapter中,我也会根据getView调用启动AsyncTask.我期待7个运行asyncTasks(如果列表可见元素是7,比方说),但DDMS只显示5个asynctasks正在运行.
现在有人可以解释一下我无法拼写的黑魔法是什么吗?
android executorservice android-asynctask threadpoolexecutor
最近我参加了一次采访,其中我被问到一个问题:课堂上可以使用多少个asynctask?通过使用execute方法,您将通过调用asynctask来使用.因此,类中asynctask的最大限制是向我提出的问题.
这是什么答案?有人可以解释一下,为什么?