从AsyncTask安全刷新活动详细信息

时间:2013-11-13 20:21:45

标签: android android-asynctask android-activity

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

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

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

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

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

  3. 只是想知道是否有更好的方法,或者第一种方式足够安全吗?

1 个答案:

答案 0 :(得分:2)

  

我可以通过在调用时将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执行相同的操作。从好的方面来说,使用这些(或两者)中的任何一个都将完全免除您以安全的方式管理身份验证和凭据的责任。在缺点方面,有供应商锁定,它可能会吓跑一些用户。