2013-03-26 45 views
1

我知道我无法从主线程(UI线程)访问MySQL数据库。所以我现在知道我有这样做的选择。我可以使用一个工作者线程(Thread t = new Thread())来访问MySQL数据库并获得我需要的内容,或者我可以使用AsyncTask访问MySQL数据库并获得我需要的内容。AsyncTask vs工作线程从MySQL数据库获取信息

但我在这里的问题是,在这里或最有效的方法是什么正确的方式吗?当我遇到这个问题时,我很想理解并遵循良好的编程过程。

因此,从MySQL数据库中检索数据:AsyncTask,一个工作线程或将没有时间差异,电源等?

回答

2

AsyncTask被设计成围绕线程和处理程序的助手类,并不构成通用线程框架。 AsyncTasks理想情况下应该用于短操作(最多几秒钟)。如果您需要保持线程长时间运行,则强烈推荐您使用java提供的各种API。 util.concurrent pacakge,如Executor,ThreadPoolExecutor和FutureTask。 (直接从文档)。

http://developer.android.com/reference/android/os/AsyncTask.html

对于长时间运行的操作,asynctask的替代方法是robospice。

https://github.com/octo-online/robospice

+0

IDK为什么说AsyncTask应该用于“最多几秒钟”......但对于很长的操作,建议使用“服务”。 – 2013-03-26 08:03:40

+0

您将在doInBackground()中运行长操作,并且无法更新ui,直到doInBackground完成,让用户等待与ui进行交互。只有在onPostExecute()ui更新并且用户可以与ui进行交互。 – Raghunandan 2013-03-26 09:39:02

+0

当使用'AsyncTask'时,你可以使用'publishProgress'来更新'UI'。 – 2013-03-26 10:05:22

2

的AsyncTask更好相比主题

的AsyncTask能够正确且容易使用的UI线程。该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。

而且通过这个Handler vs AsyncTask vs Thread

+0

谢谢Nirali为响应<3 :) – JoeyL 2013-03-26 07:15:15

+0

也要看它需要多长时间来从数据库中获取数据。不希望用户继续等待与用户界面进行交互。对于长时间运行的操作,asynctask并不好。 – Raghunandan 2013-03-26 07:16:57

+0

@Raghunandan我会说任务可能会持续~10秒。这对于asynctask来说太长了吗? – JoeyL 2013-03-26 07:20:15

3

其实最好的办法是使用Loaders。更具体一个CursorLoader。与AsyncTasksThreads相比,Loaders的优势在于Cursors将与您的ActivityFragment生命周期相关联。因此,如果您的AsyncTaskThread在您的ActivityFragment停止后完成并尝试通知不再存在的组件,那么最终不会出现在波束中。

你可以在这里找到Loaders这里的一些例子How to Use Loaders,这里Life Before Loaders