Android中的视图何时被“杀死”?

时间:2013-10-31 13:09:53

标签: android android-gui

视图何时被“杀死”且Android中不再存在?

例如,假设我有一个asynctask,我在doInBackground()方法中运行一些网络相关的东西。然后,我需要在onPostExecute()方法中更新我的UI视图。 假设我的doInBackground()花了一段时间,当它正在处理时,用户向后移动甚至按下主页按钮。该任务将继续,因为doInBackground在一个单独的线程上运行,但是,一旦完成并调用onPostExecute来更新视图,视图可能就不存在了。

  1. 即使活动不可见(无论是进入主屏幕还是其他活动),当视图尝试访问和修改时会发生什么?他们在'堆/内存/什么'中停留多长时间,他们在onDestroy之后收集垃圾了吗?或者他们留在那之后?
  2. 我知道一种不涉及这个问题的方法是使用在onResume和onStop内部打开和关闭的开关,并在更新onPostExecute中的视图之前检查它,但我不确定这是否是应用于Android应用程序?如果没有,建议的方式是什么?

3 个答案:

答案 0 :(得分:1)

活动中的view可以被视为活动类中的任何其他object。只要它被其他object引用,它就会留在内存中。此对象可以是另一个viewactivity。这意味着如果出现以下情况,视图将会消失:

1)activityparent view从视图树中删除它removeView(),因此没有人保留对它的引用。

2)包含视图的activityparent 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.你可以杀死这个过程,所以在庄园或堆中都没有任何东西。