2013-02-25 207 views
2

这可能是一个常见问题,但我无法找到我的确切场景。我明白,它在很多方面都取决于开发人员的选择,但我不知道选择最好。哪个应该使用Handler,AsyncTask或Thread?

我有我的初始应用程序启动画面,它将在检查用户登录时显示徽标。如果他们的登录详细信息已存储在sharedPreference中,那么我想检查这些详细信息与我的在线数据库的验证详细信息。一旦检查完全部,我会将用户转到主应用程序屏幕或注册屏幕。

所以当这样做检查用户的详细信息,然后验证它们。我应该单独做还是使用处理程序?我不认为需要AsyncTask,因为我不想将任何进度细节传递回UI?

TIA

回答

1

我建议使用AsyncTask。

首先,因为AsyncTask是一个完整的线程框架(在后台使用线程和处理程序),它允许更好地控制单线程操作。例如,包括cancel(),以防用户在启动画面完成前拒绝离开应用程序。

我不认为AsyncTask是必要的,因为我不想将任何 进度细节传递回UI?

其实,是你做什么,甚至启动新的活动(无论是登录还是AlreadyLoggedIn),你必须从UI线程

1

你或许应该这样做,在一个单独的线程,因为它是网络活动。 IntentService是一个不错的选择。我认为你主要关心的是,即使用户旋转屏幕并且活动被破坏并重新创建,你选择的任何方法都需要工作。

也许使用片段闪屏setRetainInstance(true),因此它会在配置更改后重新连接到活动。然后,您可以通过服务Handler(或Messenger更准确),或让服务在完成工作时发出广播意图。

1

当使用一个异步任务调用startActivity()?
AsyncTask有助于将内存密集/阻塞调用卸载到后台线程,而您的UI操作仍可以在UI线程中继续进行。 如果有任何操作将UI线程阻塞超过4-5秒,您可能还会收到ANR(Android Not Responding,安卓无响应)对话框。 AsyncTask在您想要在完成该过程(onPostExecute)之后以及在启动之前更新UI(onPreExecute)时非常方便。

使用线程 不管你使用的AsyncTask在doInBackground做也可以使用一个线程来实现的。但是,如果您需要执行任何UI操作,您将需要使用HandlerrunOnUiThread来完成您的任务。如果你想使用线程,请参考Painless Threading in android

布迪乌斯说的也是如此。

在你的情况,你可以使用的AsyncTask来检查sharedPref用户creds,然后用你的中间件适当身份验证,并最终在onPostExecute导航到一个新的活动。

在此期间,您可以显示一个进度条给用户要去身份验证过程标志着。

1

要在补充。我有一个非常类似的情况,我必须从一个“丝网之乡”请验证是否在后台用户登录(这是存储在手机中)。我使用了IntentService ResultReceiver模式。起初,我花了一点时间才能熟悉它,但一旦实现了它的管理非常简单。

基本上,你开始就是你的意图的服务活动,通过它(用户名,密码等)所需的任何参数。在我的情况下,它是一个单独的类,使用REST来验证用户。一旦REST类已完成其工作,该ResultReceiver方法onReceiveResult,将数据返回到从REST活性的UI活动。

相关问题