2015-10-18 60 views
0

以下文档页面提到android可能会在某些情况下销毁活动实例,并在稍后使用之前保存的状态重新创建它。关于android销毁和重新创建活动的问题

http://developer.android.com/training/basics/activity-lifecycle/recreating.html

我想知道什么,如果活动被破坏并重新创建以下两种情况下发生的。

1)该活动有一个匿名AsyncTask运行,它在完成时将一些值设置为UI元素。如果在AsyncTask仍在运行时活动被破坏,AsyncTask完成后会发生什么情况?如果在onPostExecute()上访问某些UI元素,是否会导致异常?如果不是,重新创建活动时,中所做的更改是否可见?

2)如果在View元素中使用View.setTag()将某个对象设置为标记,则在销毁并重新创建活动后,设置为标记的对象是否仍然可以在重新创建的视图中使用?

+0

第二点:http://stackoverflow.com/questions/16172637/is-a-views-tag-restored-when-the-activity-whose-layout-contains-the-view-is-r – njzk2

回答

1

1)如果您尝试从旧的Activity对象访问UI元素,它将引发异常。在内部,创建一个全新的Activity对象以及新的View对象,这意味着旧的引用无效。请记住,如果你持有一个硬引用,你会用你的AsyncTask泄漏内存。

2)同样的事情发生在这里。一个新的View对象被创建,旧的View的所有成员变量都会丢失。

只有保存在onSaveInstanceState()方法中的数据才会结转。您可以通过在手机的开发人员选项中启用“不保留活动”,甚至在方向更改时轻松测试此情形。您还可以使用调试器验证是否创建了新的对象引用。

0

当Async Task完成时,AsyncTask将不会更新新Activity的UI。事实上,它会尝试更新真正意义上不存在的活动的前一个实例。所以这可能会导致某种抛出IllegalArgumentException的异常或IllegalStateException异常

你为什么不通过只是创造千迭代循环的异步任务,并按回破坏活动的尝试,看看结果

1

要添加到其他人的评论,如果你要运行一个的AsyncTask,你应该在你的onPostExecute方法做的第一件事是检查活动状态:

if (!isFinishing()) { ... } 

片段具有类似的逻辑

if (isAdded() && !getActivity().isFinishing()) { ... } 

就我个人而言,我更喜欢将RxJava与RxLifecyle扩展一起使用,因为它使它更加清洁,但这是另一天的故事。

相关问题