创建asyncTask,如
AsyncTask<Void,Void,Void> newTask = new AsyncTask<Void,Void,Void>{
....
}
newTask.execute()
创建内存泄漏?
答案 0 :(得分:4)
好吧那么@sherays特别是在你的情况下,如果你对服务器执行另一个请求而前一个请求尚未完成(如果有类似的请求),这可能是内存泄漏。
实际上,AsyncTask
回收不应该有任何问题,除非你从param中引用它或在doInBackground().
内生成内存泄漏
所以,你可能会想,如果你正在创建许多长时间运行的AsyncTasks,那么它会导致一些内存问题。实际上它不是真的(至少在最新的Android版本上)。 AsyncTask源代码显示
它使用单例有界执行程序:
private static final int CORE_POOL_SIZE = 5;
private static final int MAXIMUM_POOL_SIZE = 128;
private static final int KEEP_ALIVE = 1;
public static final Executor THREAD_POOL_EXECUTOR
= new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
这意味着执行程序不会同时运行超过128个AsyncTasks(根据我的理解,128不是很大)。
它对Executor使用有界查询:
private static final BlockingQueue<Runnable> sPoolWorkQueue =
new LinkedBlockingQueue<Runnable>(10);
所以,基于以上几点,AsyncTasks创建和运行的次数是有限的而不是那么大。所以,如果AsyncTask中的代码没有创建任何内存泄漏,那么根据我的理解,没有问题。同时Android不允许您使用AsyncTasks自行发送垃圾邮件。 Checkout ThreadPoolExecutors
说明以熟悉它管理内存的方式(如果您担心同时创建的线程太多)。
所以,如果你面临内存泄漏,那么取消任务:
关于cancel()
调用,基于AsyncTask的Android文档:
取消任务
可以通过调用cancel(boolean)随时取消任务。调用此方法将导致后续调用isCancelled()返回true。调用此方法后,将在doInBackground(Object [])返回后调用onCancelled(Object)
而不是onPostExecute(Object)。为了确保尽快取消任务,您应该始终从isCancelled()
定期检查doInBackground(Object[])
的返回值,如果可能的话(例如在循环内)。
答案 1 :(得分:0)
是:在调用onPostExecute
之后收集的线程是垃圾还是在内存中?
在解除活动时,不会取消或销毁异步任务。如果你的帖子在一小段时间后或多或少轻量级和完成,只需让它继续运行并在yourActivity.this.isFinishing()
中添加onPostExecuteMethod
子句。