【问题标题】:Safely refresh activity details from AsyncTask从 AsyncTask 安全地刷新活动详细信息
【发布时间】:2013-11-13 20:21:44
【问题描述】:

我有一个带有关联网站的 Android 应用。 我有一个 LoginActivity,它接受用户凭据,使用 AsyncTask 子类在网站上验证它们,如果正确将它们存储在 SharedPreferences 中以供将来使用。

我有一个 MainActivity,它根据 SharedPreferences 值显示用户详细信息。

所以当 AsyncTask 完成后,我需要刷新 Main 活动中显示的用户详细信息。

  1. 我可以通过在调用它时将对 MainActivity 的引用传递给 LoginActivity 来做到这一点,然后在 AsyncTask onPostExecute 中,调用该 MainActivity 实例中的一个函数来刷新显示的数据。 这似乎是一种常见的方式,但我不确定它是否完全安全。这不太可能,但是如果 MainActivity 在 AsyncTask 仍在处理时被操作系统终止会发生什么?

  2. 或者,在这种情况下,我可以在启动 LoginActivity 时完成 MainActivity,然后从 onPostExecute 启动一个新的 MainActivity,它将显示刷新的数据。 但我可能还有其他活动,其中在后台 AsyncTask 刷新数据时正在进行用户交互 - 在这些情况下,第二种方法将不起作用。

只是想知道是否有更好的方法,还是第一种方法足够安全?

【问题讨论】:

  • 1.要在 AsyncTask 处理时处理 MainActivity 关闭,您应该让 MainActivity 使用 AsyncTask “取消注册”其自身,然后在任务回调主 Activity 之前,它应该检查该 Activity 本身是否“未注册”跨度>

标签: android android-asynctask android-activity


【解决方案1】:

我可以通过在调用它时将对 MainActivity 的引用传递给 LoginActivity 来做到这一点,然后在 AsyncTask onPostExecute 中,调用该 MainActivity 实例中的一个函数来刷新显示的数据。

处理来来去去的活动的开箱即用方式是使用AsyncTaskLoader。这种方法实现了@ByteMe 的注销/注册活动实例的建议。不幸的是,它的程序员 API 是……不那么痛苦。特别是,API 是为打开时立即开始加载的屏幕编写的。在用户交互时开始加载的屏幕中使用Loaders API 是完全可能的,但实现有点尴尬。

一种常见的替代方法 - 仍然只使用 core- 和 support-v4 库类 - 是使用 IntentService 来完成后台工作,并使用 LocalBroadcastManager 来传递结果。

如果可以选择使用开源库,您可能需要查看Otto BusRxJava 来传递“加载完成”事件。

或者,在这种情况下,我可以在启动 LoginActivity 时完成 MainActivity,然后从 onPostExecute 启动一个新的 MainActivity,它会显示刷新的数据。

如果我理解正确,MainActivity 是您的启动活动。它做的第一件事是检查是否需要登录,如果是,它会定向到LoginActivity。如果不需要登录,则显示帐户数据,如果是,则等待LoginActivity 返回。

在我看来,这非常适合 startActivityForResult(Intent, int)。只需让主要活动使用请求代码启动登录活动。登录活动可以调用 setResult(int, Intent) 并返回代码和身份验证数据。然后主要活动可以实现onActivityResult() 以从登录活动中获取返回值并完成所有需要完成的工作。

另外一个好处是,您可以将所有SharedPreferences 交互集中在主要活动中,并将其完全保留在登录活动之外。这样可以降低两者之间的耦合度。

您可以考虑的一种完全不同的方法是完全放弃用户身份验证,并依靠Google+ Sign-in 通过用户的 Google+ 帐户来识别用户。您可以通过Facebook 执行相同的操作。从好的方面来说,使用其中任何一个(或两者)将使您完全摆脱以安全方式管理身份验证和凭据的责任。不利的一面是,存在供应商锁定,可能会吓跑一些用户。

【讨论】:

  • 太好了,startActivityForResult / onActivityResult 正是我所需要的,完美运行。我喜欢传回数据并集中 SharedPrefs 访问的建议,这更有意义。谢谢一百万
猜你喜欢
  • 2016-10-19
  • 2017-01-01
  • 1970-01-01
  • 2016-04-21
  • 2012-04-03
  • 2019-03-08
  • 1970-01-01
  • 2015-06-27
  • 2019-07-17
相关资源
最近更新 更多