2
new Thread(new Runnable(){

}).run();

对比

new AsyncTask().execute();

我的印象是它们是同一件事,都启动了一个新的工作线程,但不是这样吗?

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

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

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

编辑

不知道为什么关闭,因为提供的链接我已经阅读并且没有回答我的问题并且没有提到使用run()vsstart()确实回答了我的问题

4

3 回答 3

6

如果您调用 run() 而不是 start(),它将在调用它的线程上运行。如果您调用 start(),那么它会创建一个新线程。这就是您收到错误的原因,因为您调用了 .run()

于 2013-03-16T15:53:53.143 回答
0

NetworkOnMainThreadException exception occurs because you are making a network call on the main UI thread.

If you use AsyncTask you can get rid of that exception. From the documentation AsyncTasks should ideally be used for short operations (a few seconds at the most.) If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs provided by the java.util.concurrent pacakge such as Executor, ThreadPoolExecutor and FutureTask.

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

http://android-developers.blogspot.in/2009/05/painless-threading.html. The article on the link has a good explanation on the topic.

An alternative to AsyncTask is RoboSpice.https://github.com/octo-online/robospice.

于 2013-03-16T16:03:49.670 回答
0

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

如果AsyncTask您可以通过此方法从服务器下载数据doInBackground()并在postExecute().

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

于 2013-03-16T15:50:29.183 回答