我使用AsyncTask
从本地数据库(sqlite)更新列表,如下所示:
@Override
public void onResume() {
super.onResume();
new MyAsynctask().execute();
}
我需要清楚地解释每次新MyAsynctask执行时会发生什么,以及之前创建的前一个MyAsynctask发生了什么,以及这种方式会花费更多内存?
答案 0 :(得分:1)
您的新异步任务不执行任何操作。
AsyncTasks相继执行。
只有当您的旧异步任务结束时,新的任务才会开始运行。
答案 1 :(得分:0)
AsyncTask
只是管理后台任务和UI更新的线程实现。 AsyncTask
被设计为android中的Thread
和Handler
附近的助手类。文档。
AsyncTask可以正确,轻松地使用UI线程。此类允许您在UI线程上执行后台操作和发布结果,而无需操纵线程和/或处理程序。
因此,每次致电new MyAsynctask().execute();
时,您的问题都将开始。如果没有完成,旧的也会运行。
要取消上一个任务,您可以使用全局任务实例,并通过getStatus()
检查状态是否正在运行
if(asyncTask!=null && asyncTask.getStatus()== AsyncTask.Status.RUNNING){
asyncTask.cancel(true);
}
在您的情况下,您在onResume()
中创建新任务,因此每次您的活动恢复时,都会创建新线程,这对于刷新屏幕来说不是内存有效的解决方案。
有关取消任务的更多详细信息,请阅读第Cancelling a task部分和cancel(boolean)。
答案 2 :(得分:0)
如果你知道如何管理它,那么它不是内存泄漏。
您的AsyncTask
将在onResume()
函数内执行,因此它会在以下时间运行:
Activity
被重新创建Activity
Application
Intent
回来的
App
您可能希望为AsyncTask
保留一个类字段,并在onCreate()
中对其进行实例化:
private MyAsyncTask asyncTask;
如果Activty
未被销毁(点数:1,2(可能),4(可能),5(可能)),您可以轻松检查asyncTask
状态并取消需要的。
问题是,如果重新创建AsyncTask
,则在您开始新的Activity
时,旧Activity
可能仍在运行。由于asyncTask
实例是新的,Thread
引用也会指向一个新的对象:在这种情况下,您将有一个野蛮的Android
在运行背景。
除非Activity
的操作系统杀死了Thread
拥有的AsyncTask
(不确定),否则您仍可能获得通过了解并确保您的AsyncTask
最多运行几秒钟,而不执行任何阻止IO操作。但这并不是一个真正的工程解决方案。
我要说的是,最佳且更符合标准的解决方案是:通过保留Activity
中asyncTask.cancel()
的引用,只需调用{{ 1}}在您的onPause()
方法中。并且您确定在AsyncTask
被暂停或销毁之前,Activity
的帖子将被取消。
您的代码将如下所示:
private MyAsyncTask asyncTask;
protected void onCreate() {
this.asyncTask = new MyAsyncTask();
}
protected void onResume() {
this.asyncTask.execute();
}
protected void onPause() {
this.asyncTask.cancel();
}