【问题标题】:Online Transaction: asynctask vs service在线交易:asynctask vs service
【发布时间】:2012-06-29 02:47:13
【问题描述】:

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

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

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

应该改用服务吗?

【问题讨论】:

  • 在 google 上搜索会显示很多结果,前 3 个来自 SO 本身:google.com/…
  • @VirenShakya 我已经阅读了这些帖子,但没有一个能让我清醒。例如,stackoverflow.com/questions/2620917/… 的已接受答案甚至未被所有评论者接受。我仍然不确定解决方案。

标签: android android-asynctask android-service


【解决方案1】:

What is a Service?

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

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

Should you use a service or a thread?

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

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

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

What causing the activity to be destryed when user rotates the phone?

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

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

Possible workaround to solve AsyncTask interruption due to Activity recreation:

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

【讨论】:

    猜你喜欢
    • 2018-02-18
    • 1970-01-01
    • 2014-08-30
    • 2010-12-30
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多