1

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

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

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

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

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

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

4

1 回答 1

2

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

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

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

如果使用开源库是一种选择,您可能希望查看Otto BusRxJava来提供“加载完成”事件。

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

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

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

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

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

于 2013-11-13T20:41:38.877 回答