这可能是一个常见的问题,但我找不到我的确切方案。我理解它在很多方面都取决于开发人员的选择,但我不知道选择最好的方式。
我的初始应用程序启动画面只会在检查用户登录时显示徽标。如果他们的登录详细信息已存储在sharedPreference中,那么我想根据我的在线数据库检查这些详细信息以进行验证。一旦全部检查完毕,我会将用户传递到主应用程序屏幕或注册屏幕。
因此,在检查用户详细信息时,然后验证它们。我应该单独执行此操作还是使用处理程序?我不认为需要AsyncTask,因为我不想将任何进度细节传递回UI?
TIA
答案 0 :(得分:1)
您应该在单独的线程中执行此操作,因为它是网络活动。 IntentService
是个不错的选择。我认为你主要担心的是,即使用户旋转屏幕并且活动被破坏和重新创建,你选择的任何方法都需要工作。
也许使用片段作为setRetainInstance(true)
的启动画面,因此在配置更改后它将重新附加到活动。然后,您可以将服务传递Handler
(或Messenger
更准确),或让服务在完成工作时发出广播意图。
答案 1 :(得分:1)
我建议使用AsyncTask。
首先,因为AsyncTask是一个完整的线程框架(在幕后使用Thread和Handler),它允许更好地控制单线程操作。例如,包括cancel()
,以防用户在启动屏幕完成之前决定离开应用程序。
我不认为需要AsyncTask,因为我不想传递任何东西 进度细节回到UI?
实际上,是的,即使要启动新活动(Login或AlreadyLoggedIn),您必须从UI线程调用startActivity()
答案 2 :(得分:1)
何时使用异步任务?
AsyncTask有助于卸载对后台线程的内存密集型/阻塞调用,同时,您的UI操作仍可在UI线程中继续进行。
如果任何操作阻止UI线程超过4-5秒,您可能还会得到一个ANR(Android Not Responding)对话框。当你想在完成这个过程(onPostExecute
)之后以及在开始之前(onPreExecute
)更新UI时,AsyncTask会派上用场。
使用线程
无论你在doInBackground
中使用AsyncTask做什么,也可以使用Thread实现。但是,如果您需要执行任何UI操作,则需要使用Handler
或runOnUiThread
来完成任务。如果您想使用线程,请参阅Painless Threading in android。
Budius所说的也是如此。
在您的情况下,您可以使用AsyncTask检查sharedPref中的用户信誉,然后使用您的中间件进行适当的身份验证,最后在onPostExecute中导航到新活动。
同时,您可以向用户显示进度条,表示正在进行的身份验证过程。
答案 3 :(得分:1)
添加到那个。我有一个非常类似的情况,我必须在“主屏幕”的后台验证用户登录(存储在手机中)。我使用了IntentService ResultReceiver模式。起初我花了一些时间来加快它的速度,但是一旦它实现了它非常简单的管理。
基本上,您启动作为您的意向服务的活动,向其传递所需的任何参数(用户名,密码等)。在我的例子中,它是一个单独的类,使用REST来验证用户。一旦REST类完成其工作,ResultReceiver方法onReceiveResult就会将数据从REST活动返回给UI活动。