1

视图什么时候被“杀死”并且在 Android 中不再存在?

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

  1. 即使活动不可见(进入主屏幕或其他活动),当视图试图被访问和修改时会发生什么?他们在“堆/内存/任何东西”中停留了多长时间,在 onDestroy 之后他们会被垃圾收集吗?或者他们在那之后留下来?

我知道避免这种麻烦的一种方法是使用在 onResume 和 onStop 内部打开和关闭的开关,并在更新 onPostExecute 中的视图之前检查它,但我不确定这是否是在 android 应用程序中应用的可靠方法?如果没有,建议的方法是什么?

4

3 回答 3

1

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

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

2)包含视图的activityor被销毁/从内存中消失。parent view

如果活动不可见(进入主屏幕或其他活动),当视图试图被访问和修改时会发生什么?他们在“堆/内存/任何东西”中停留了多长时间,在 onDestroy 之后他们会被垃圾收集吗?或者他们在那之后留下来?

只要您的活动可用,您就可以访问该视图。您可以通过阅读活动生命周期找到更多相关信息

当您尝试访问从内存中消失的视图时,您将获得一个NullPointerException. 您可以处理的简单而可靠的方法onPostExecute是在更新之前检查 null,例如:

// inside onPostExecute
if(textView != null) {
   textView.setText("Background Method Finished");
}

这种方法的优点是:

1)您不必明确跟踪show/hide

2)有时,视图不在屏幕上并不意味着它从内存中消失了。例如,假设您的活动没有AsyncTask完成,而您的活动paused/stopped不是destroyed。在这种情况下,您仍然可以更新视图,以便在活动时resumed更新可见并且不会丢失。

于 2013-10-31T13:33:00.303 回答
0

当用户离开该活动时取消异步任务。取消任务后,onPostExecute 将不会被调用并在异步任务类的 onCanceled 事件中捕获取消事件。

于 2013-10-31T13:25:08.477 回答
-2

你有很多方法

1.可以取消异步任务

2.你可以杀死进程,所以内存或堆中不会有任何东西。

于 2013-10-31T13:23:47.517 回答