视图何时被“杀死”且Android中不再存在?
例如,假设我有一个asynctask,我在doInBackground()
方法中运行一些网络相关的东西。然后,我需要在onPostExecute()
方法中更新我的UI视图。
假设我的doInBackground()
花了一段时间,当它正在处理时,用户向后移动甚至按下主页按钮。该任务将继续,因为doInBackground在一个单独的线程上运行,但是,一旦完成并调用onPostExecute来更新视图,视图可能就不存在了。
我知道一种不涉及这个问题的方法是使用在onResume和onStop内部打开和关闭的开关,并在更新onPostExecute中的视图之前检查它,但我不确定这是否是应用于Android应用程序?如果没有,建议的方式是什么?
答案 0 :(得分:1)
活动中的view
可以被视为活动类中的任何其他object
。只要它被其他object
引用,它就会留在内存中。此对象可以是另一个view
或activity
。这意味着如果出现以下情况,视图将会消失:
1)activity
或parent view
从视图树中删除它removeView()
,因此没有人保留对它的引用。
2)包含视图的activity
或parent view
将从内存中销毁/消失。
如果活动不可见(要么转到主屏幕,要么转到另一个 当视图尝试访问和修改时会发生什么 ?他们在'堆/记忆/什么'中停留多久,他们得到了什么 onDestroy之后收集的垃圾?或者他们在那之后留下来?
只要您的活动可用,您就可以访问该视图。您可以通过阅读Activity Lifecycle
找到更多相关信息当您尝试访问已从内存中消失的视图时,您将获得NullPointerException
。简单&如何处理onPostExecute
的方法是通过在更新前检查null,例如:
// inside onPostExecute
if(textView != null) {
textView.setText("Background Method Finished");
}
这种方法的优点是:
1)您无需明确跟踪显示/隐藏。
2)有时,视图不在屏幕上并不意味着它从内存中消失了。例如,假设您的AsyncTask
在您的活动为paused/stopped
而不是destroyed
时结束。在这种情况下,您仍然可以更新视图,以便在活动为resumed
时,更新可见且不会丢失。
答案 1 :(得分:0)
当用户离开该活动时取消异步任务。取消任务后,onPostExecute将不会在异步任务类中的onCanceled事件中调用并捕获取消事件。
答案 2 :(得分:-2)
你有很多方法
1.您可以取消asynctask
2.你可以杀死这个过程,所以在庄园或堆中都没有任何东西。