Java 在onResume方法内启动异步任务是否需要更多内存?
我使用Java 在onResume方法内启动异步任务是否需要更多内存?,java,android,multithreading,android-asynctask,Java,Android,Multithreading,Android Asynctask,我使用AsyncTask从本地数据库(sqlite)更新列表,如下所示: @Override public void onResume() { super.onResume(); new MyAsynctask().execute(); } 我需要清楚地解释每次执行新的MyAsynctask时会发生什么,以及先前创建的MyAsynctask会发生什么,以及这种方式是否会占用更多内存?AsyncTask只是一个线程的实现,用于管理后台任务和UI更
AsyncTask
从本地数据库(sqlite)更新列表,如下所示:
@Override
public void onResume() {
super.onResume();
new MyAsynctask().execute();
}
我需要清楚地解释每次执行新的MyAsynctask时会发生什么,以及先前创建的MyAsynctask会发生什么,以及这种方式是否会占用更多内存?
AsyncTask
只是一个线程的实现,用于管理后台任务和UI更新AsyncTask
被设计成android中Thread
和Handler
的助手类
AsyncTask允许正确且轻松地使用UI线程。此类允许您在UI线程上执行后台操作和发布结果,而无需操作线程和/或处理程序。因此,每次调用
newmyasynctask().execute()时,您都会遇到问题代码>将启动一个新线程。如果没有完成,旧的也会运行。
要取消上一个任务,您可以使用任务的全局实例,并通过getStatus()
在您的情况下,您在onResume()
中创建新任务,因此每次活动恢复时都会创建新线程,这不是刷新屏幕的内存有效解决方案。
有关取消任务的更多详细信息,请阅读部分和。如果您知道如何管理它,则它不是内存泄漏
您的AsyncTask
将在onResume()函数中执行,因此它将在以下情况下运行:
每次(重新)创建活动时
您从另一个活动回来
你改变屏幕方向
您从另一个由意图启动的应用程序返回
您关闭并重新打开应用程序
您可能希望为AsyncTask
保留一个类字段,并在onCreate()
中实例化它:
如果activity
未被销毁(第1点、第2点(可能)、第4点(可能)、第5点(可能)),您可以轻松检查asyncTask
状态,并在需要时取消它
问题在于,如果重新创建了活动
,则启动新任务时,旧的异步任务
可能仍在运行。由于活动
实例是新实例,因此异步任务
引用也将指向一个新对象:在这种情况下,您将在后台运行一个savage线程
除非Android
的操作系统杀死了活动
拥有的线程
(对此不确定),否则您仍然可以知道并确保异步任务
最多运行几秒钟,而不执行任何阻塞IO操作。但这并不是一个真正的工程解决方案
我想说,最好且更符合标准的解决方案是:通过在活动中保持对AsyncTask
的引用,只需在onPause()
方法中调用AsyncTask.cancel()
。您将确保在您的活动
暂停或销毁之前,异步任务
的线程将被取消
然后,您的代码将如下所示:
private MyAsyncTask asyncTask;
protected void onCreate() {
this.asyncTask = new MyAsyncTask();
}
protected void onResume() {
this.asyncTask.execute();
}
protected void onPause() {
this.asyncTask.cancel();
}
您的新异步任务不执行任何操作
异步任务是一个接一个地执行的
只有当旧异步任务结束时,新的异步任务才会开始运行。问题是:每次在活动中调用onResume时,都会创建并执行一个新的MyAsynctask。巨大的内存泄漏:o。你必须自己停止它,重新创建它!请给我停止MyAsynctask并重新创建的最佳实践it@ReneFerrari您如何判断这是一个(巨大的)内存泄漏?异步任务一结束,它就被清除了。我想他的意思是OutOfMemory
,而不是内存泄漏。内存泄漏对我来说是指您没有预料到的仍在运行并消耗内存的东西。本例中的问题是,如果多次调用onResume(),许多异步任务将并行运行。因此,内存消耗增加了很多,正如Enzokie所提到的,可能会导致OutOfMemory。ADM已经写了一个解释如何避免这种情况的答案:)不幸的是,如果重新创建活动
,那么异步任务
实例也将重新创建。如果随后检查状态,则它将与新的asyncTask
实例相关,而不是与旧实例(可能仍在运行)相关。我认为他最好在onPause()
中手动停止任务。我只是暗示如何检查状态。这取决于活动生命周期的实现和参与。当异步任务死亡时,ayct任务在doInBackground()结束时结束,然后在onPostExecute()结束后结束。
private MyAsyncTask asyncTask;
private MyAsyncTask asyncTask;
protected void onCreate() {
this.asyncTask = new MyAsyncTask();
}
protected void onResume() {
this.asyncTask.execute();
}
protected void onPause() {
this.asyncTask.cancel();
}