0

我的应用程序的初始活动在其 onStart() 方法中将 Intent 发送到 IntentService。它在用于调用服务的 Intent 中放置一个 ResultReceiver(匿名内部类)。然后服务使用 ResultReceiver 将数据库传递给调用者。

这似乎工作正常,除非我启动应用程序,并且在服务调用仍在运行时,快速点击“返回”按钮返回主屏幕。一旦服务操作完成,它就会将结果发送到 ResultReceiver,其 onReceiveResult() 方法会创建一个进度对话框(使用 MyActivity.this 作为上下文)并继续执行其他操作。

由于活动已经完成,因此尝试创建进度对话框会生成异常:

06-23 23:29:14.114: E/AndroidRuntime(29570): FATAL EXCEPTION: main
06-23 23:29:14.114: E/AndroidRuntime(29570): android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@4051bf80 is not valid; is your activity running?
06-23 23:29:14.114: E/AndroidRuntime(29570):    at android.view.ViewRoot.setView(ViewRoot.java:557)
06-23 23:29:14.114: E/AndroidRuntime(29570):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
06-23 23:29:14.114: E/AndroidRuntime(29570):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
06-23 23:29:14.114: E/AndroidRuntime(29570):    at android.view.Window$LocalWindowManager.addView(Window.java:433)
06-23 23:29:14.114: E/AndroidRuntime(29570):    at android.app.Dialog.show(Dialog.java:265)
06-23 23:29:14.114: E/AndroidRuntime(29570):    at android.app.ProgressDialog.show(ProgressDialog.java:107)
06-23 23:29:14.114: E/AndroidRuntime(29570):    at android.app.ProgressDialog.show(ProgressDialog.java:90)
06-23 23:29:14.114: E/AndroidRuntime(29570):    at android.app.ProgressDialog.show(ProgressDialog.java:85)
06-23 23:29:14.114: E/AndroidRuntime(29570):    at com.myapp.SplashScreen.someMethod(SplashScreen.java:137)

那么:为了避免上述情况,做这种事情的正确方法是什么?

在显示对话框之前,必须检查活动是否仍在每个回调中运行,这似乎非常繁琐。仅这一点就让我怀疑我走错路了。

编辑添加:

这实际上似乎只在我启动我的应用程序时发生,快速关闭它(通过返回按钮到主屏幕)然后快速再次启动它。如果我只是启动它并点击后退按钮然后坐在那里几秒钟,我永远不会遇到异常。

4

0 回答 0