新线程和AsyncTask之间的区别

时间:2013-03-16 15:49:10

标签: android multithreading

new Thread(new Runnable(){

}).run();

VS

new AsyncTask().execute();

我的印象是他们是同一个东西,都开始了一个新的工作线程,但事实并非如此吗?

我问的原因是因为如果我尝试使用new Thread()进行任何类型的网络连接,我会得到一个NetworkOnMainThreadException但是当我在异步任务中放入相同的代码时,我没有得到它。

这种差异的另一个例子是使用google maps api v2,其中所有情节/显示/隐藏都必须在main thread上完成,但如果我使用new Thread()来隐藏/显示标记,则显示正常但如果我尝试在异步任务中显示/隐藏,我会得到一个异常,说它需要在主线程上完成。

new Thread()真的没有启动工作线程吗?

编辑

不知道为什么关闭这个因为提供的链接我已经阅读并且没有回答我的问题,并且没有提及使用run() vs start()来回答我的问题

3 个答案:

答案 0 :(得分:6)

如果调用run()而不是start(),它将在调用它的线程上运行。如果调用start(),则会创建一个新线程。这就是你得到错误的原因,因为你打电话给.run()

答案 1 :(得分:0)

基本上两者都是等价的,但在与GUI集成方面,AsyncTask在android中更简单,更好。

如果是AsyncTask,您可以使用此方法从doInBackground()中的服务器下载数据,并在postExecute()中更新GUI。

AsyncTask可以正确,轻松地使用UI线程。该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。

答案 2 :(得分:0)

出现NetworkOnMainThreadException异常,因为您正在主UI线程上进行网络调用。

如果您使用AsyncTask,您可以摆脱该异常。从文档 AsyncTasks理想情况下应该用于简短操作(最多几秒钟。)如果您需要保持线程长时间运行,强烈建议您使用java提供的各种API。 util.concurrent pacakge,如Executor,ThreadPoolExecutor和FutureTask。

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

http://android-developers.blogspot.in/2009/05/painless-threading.html。该链接上的文章对该主题有一个很好的解释。

AsyncTask的替代方案是RoboSpice。https://github.com/octo-online/robospice