1

这是场景:

  • 账户登录页面
  • 单击“登录”会触发登录 AsyncTask
  • 要在网络访问期间阻止 UI,会弹出 ProgressDialog
  • 返回时,ProgressDialog 被关闭,用户转发

此流程运行良好。

这是问题所在:

  • 用户可以在 AsyncTask 登录时旋转屏幕

目前,ProgressDialog 由类字段引用,并使用该指针和调用 .dismiss() 将其关闭。

但是,如果屏幕旋转,一切都会崩溃。

可能是因为重新创建了 Activity?我怀疑该字段引用周围的闭包指向一个无法访问的对象。你怎么看?

我怎样才能可靠而优雅地解决它?只需添加if (... != null)支票?

更一般地说,我必须承认我不明白在这样的情况下应用的“最佳实践”:

  • 活动 A 触发 AsyncTask
  • 用户离开活动 A(后退按钮?旋转屏幕?onClick 启动 Intent?)
  • 当 Activity A 不再是最顶层但其 onPostExecute() 具有 UI 效果时,AsyncTask 返回,注意:原始委托观察者不再可用。

  • 困惑*(注意:我是初学者,所以彻底的解释会对我有很大帮助)

4

2 回答 2

1

是的,在改变方向时,活动被破坏然后再次重新创建。
当运行时发生配置更改时,默认情况下会关闭并重新启动 Activity,但使用此属性声明配置会阻止 Activity 重新启动。相反,活动保持运行并调用其 onConfigurationChanged() 方法。
将此行添加android:configChanges="orientation|keyboardHidden" 到您的清单文件

<activity
    android:name=""
    android:label="" 
    android:configChanges="orientation|keyboardHidden" />
于 2012-12-19T00:55:34.067 回答
0

我建议查看处理运行时更改。有关您可用的方法的详细信息的详细说明。

android:configChanges="orientation..." tells android your application will take care of resizing the current view hierarchy.  As such, when you specify that in your manifest, your activity will not be destroyed and recreated, instead the system will just call your activity's `onConfigurationChanged()` method.  As it so happens, most of the stock widgets will resize themselves when their container changes, so if you are using basic layouts, this usually "just works" by redrawing the view hierarchy in the new format.  For custom widgets, this trick may not work.  

批准的方法是在方法中保存你被销毁时的一些配置实例信息onSaveInstanceState(),然后在方法中重新创建你的状态onCreate()

在您的情况下,当屏幕更改方向时对话框将被关闭,因此您可以保持这种状态,也可以在onCreate().

于 2012-12-19T01:24:39.383 回答