1

给定用户必须使用应用程序执行在线交易(例如在线支付)的用例。

这应该在不阻塞 UI 的情况下完成,所以我打算使用 AsyncTask。问题在于以下场景: - 用户在交易过程中旋转手机或接到来电,从而导致活动被破坏。

如果我理解正确, asynctask 现在有一个对陈旧对象的引用。所以交易完成后,没有办法通知用户结果。是吗?

应该改用服务吗?

4

1 回答 1

2

什么是服务?

关于 Service 类的大多数困惑实际上都围绕着它不是什么:

  • 服务不是一个单独的进程。Service 对象本身并不意味着它在自己的进程中运行;除非另有说明,否则它在与其所属的应用程序相同的进程中运行。
  • 服务不是线程。它本身并不是一种脱离主线程工作的方法(以避免应用程序无响应错误)。

你应该使用服务还是线程?

服务只是一个组件,即使用户没有与您的应用程序交互,它也可以在后台运行。因此,只有在需要时才应该创建服务。

如果您需要在主线程之外执行工作,但仅在用户与您的应用程序交互时执行,那么您可能应该创建一个新线程而不是服务。例如,如果您想播放一些音乐,但仅在您的活动运行时,您可以在 onCreate() 中创建一个线程,在 onStart() 中开始运行它,然后在 onStop() 中停止它。还可以考虑使用 AsyncTask 或 HandlerThread,而不是传统的 Thread 类。有关线程的更多信息,请参阅进程和线程文档。

请记住,如果您确实使用服务,默认情况下它仍会在应用程序的主线程中运行,因此如果它执行密集或阻塞操作,您仍应在服务中创建一个新线程。

当用户旋转手机时,是什么导致活动被破坏?

如果设备的配置(由 Resources.Configuration 类定义)发生更改,则显示用户界面的任何内容都需要更新以匹配该配置。因为 Activity 是与用户交互的主要机制,所以它包括对处理配置更改的特殊支持。

除非您另有说明,否则配置更改(例如屏幕方向、语言、输入设备等的更改)将导致您当前的活动被破坏,并通过 onPause()、onStop() 和onDestroy() 视情况而定。如果活动在前台或对用户可见,则在该实例中调用 onDestroy() 后,将创建该活动的新实例,使用前一个实例从 onSaveInstanceState(Bundle) 生成的 saveInstanceState。

解决由于 Activity 重新创建而导致的 AsyncTask 中断的可能解决方法:

在某些特殊情况下,您可能希望根据一种或多种类型的配置更改绕过重新启动活动。这是通过清单中的 android:configChanges 属性完成的。对于您说您在那里处理的任何类型的配置更改,您将收到对当前活动的 onConfigurationChanged(Configuration) 方法的调用,而不是重新启动。但是,如果配置更改涉及您未处理的任何内容,则活动仍将重新启动,并且不会调用 onConfigurationChanged(Configuration)。

于 2012-06-29T03:05:38.613 回答