2013-10-31 32 views
1

什么时候该视图的“死亡”,并在Android中不存在?何时在android中查看'杀死'?

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

  1. 即使活动不可见(无论是主屏幕还是其他活动),当视图尝试访问和修改时会发生什么?他们在'堆/内存/任何'中停留多久,在onDestroy之后是否收集垃圾?或者他们在那之后呆在附近?

我知道一个办法不进入这个hastle是使用被打开和关闭内部的onResume和的onStop开关和onPostExecute更新视图之前检查一下吧,但我不能确定这是否是固体的方法在android应用中应用?如果不是,建议的方式是什么?

回答

1

A view活动内部可以被认为是活动类中的任何其他object。只要它被其他一些object引用,它将一直保留在内存中。此对象可能是另一个viewactivity。这意味着视图将在以下情况下消失:

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

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

如果活动是不可见的(无论是去主屏幕,或其他 活动),当意见设法把访问和体改 会发生什么?他们在'堆/记忆/任何'中停留多久,他们在onDestroy之后获得垃圾回收吗? ?或者他们在那之后呆在附近?

只要您的活动可用,您就可以访问该视图。并且您可以通过阅读Activity Lifecycle

当您尝试访问已从内存中删除的视图时,您将收到NullPointerException。简单&固体方式,您可以如何处理onPostExecute是更新前检查空,例如:

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

这种方法的优点是:

1)您没有明确跟踪显示/隐藏

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

+0

感谢您的详细解答! – tony9099

-2

你有很多方法

1.You可以取消的AsyncTask

2.You可以杀死进程,所以会有没有在menory或堆。

+0

这不是我的问题。 – tony9099

+1

视图与一个活动相关联,如果你杀了一个活动,视图也会被杀死 – Meenal

+0

-1暗示杀死该过程 - 这是完全没有要求的。 –

0

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

+0

@bump你是什么意思? – tony9099