[英]Does starting an AsyncTask inside onResume method does cost more memory?
我使用AsyncTask
从本地数据库(sqlite)更新列表,如下所示:
@Override
public void onResume() {
super.onResume();
new MyAsynctask().execute();
}
我需要清楚的解释,每次执行新的MyAsynctask时会发生什么,以及较早创建的先前MyAsynctask会发生什么,以及这种方式是否会占用更多内存?
您的新异步任务什么也不做。
AsyncTasks彼此之后执行。
只有当您的旧异步任务结束时,新任务才会开始运行。
AsyncTask
只是用于管理后台任务和UI更新的线程的实现。 从文档开始, AsyncTask
被设计为围绕android中的Thread
和Handler
的帮助器类。
通过AsyncTask,可以正确,轻松地使用UI线程。 此类允许您执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。
因此,对于您的问题,每次调用new MyAsynctask().execute();
新线程将启动。 如果没有完成,较老的也会运行。
要取消先前的任务,可以使用task的全局实例,并通过getStatus()
检查状态是否为RUNNING。
if(asyncTask!=null && asyncTask.getStatus()== AsyncTask.Status.RUNNING){
asyncTask.cancel(true);
}
在您的情况下,您可以在onResume()
创建新任务,因此每次您的活动恢复时都会创建新线程,这不是刷新屏幕的内存有效解决方案。
有关取消任务的更多详细信息,请参阅取消任务和cancel(boolean)部分 。
如果您知道如何管理它,那不是内存泄漏。
您的AsyncTask
将在onResume()
函数中执行,因此它将在以下情况下运行:
Activity
Activity
回来 Intent
启动的Application
回来 App
您可能想要为AsyncTask
保留一个类字段,并在onCreate()
实例化它:
private MyAsyncTask asyncTask;
如果Activty
未被销毁(点数:1、2(可能),4(可能),5(可能)),则可以轻松检查asyncTask
状态并在需要时将其取消。
问题在于,如果重新创建了Activity
,则在启动新的AsyncTask
可能仍在运行。 并且由于Activity
实例是新实例,因此asyncTask
引用也将指向新对象 :在这种情况下,您将在后台运行一个野蛮Thread
。
除非Android
的操作系统杀死Activity
的自有Thread
(对此不确定) , 否则您可能仍然可以通过了解并确保 AsyncTask
最多运行几秒钟而不执行任何阻塞的IO操作来逃脱AsyncTask
。 但这并不是真正的工程解决方案。
我想说, 最好的,更符合标准的解决方案是:通过在Activity
保留对AsyncTask
的引用,只需在onPause()
方法中调用asyncTask.cancel()
。 而且,您可以确保在Activity
暂停或销毁之前,将取消AsyncTask
的线程。
您的代码将如下所示:
private MyAsyncTask asyncTask;
protected void onCreate() {
this.asyncTask = new MyAsyncTask();
}
protected void onResume() {
this.asyncTask.execute();
}
protected void onPause() {
this.asyncTask.cancel();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.