Android中Thread、Runnable、Asyntask的区别与联系

Android中的UI主线程不是线程安全的。开发人员必须注意以下两点:

1.更新UI界面的操作必须在UI主线程中进行;

2.耗时操作不能在UI主线程中进行,否则会出现ANR错误。

那么如果我要完成一个耗时操作,结束后更新UI界面来显示耗时操作的结果,应该怎么办呢? 有两种方法:使用Thread+Handler;使用AsynTask。

无论Thread、Runnable还是Asyntask,其实都是多线程操作。那么三者有什么区别呢?

1.Thread:

类。可以继承该类来定义你自己的线程类,重写run()方法实现你想要在线程中完成的操作。

2.Runnable:

接口。重写run()方法实现你想要在线程中完成的操作。

3.AsynTask:

抽象类。实现doInBackground()方法实现你想要在线程中完成的操作。

 

比较:

1.Thread和Runnable:可参考http://wenku.baidu.com/view/c242df69011ca300a6c39077.html

(1) 说白了就是类和接口的区别。Thread是一个类,java中是不允许继承多个父类的,这就是Thread的一个局限性。而是用Runnable就不同了,可以implements多个接口,同时继承一个父类,这样会更加灵活。

(2)当多个线程需要共享资源时,用Thread很难达到目的,但是用Runnable接口就容易许多。

(3)二者的联系:看源码可以发现,Thread其实就是继承了Runnable接口的子类。

2.Thread和AysnTask:可参考http://blog.csdn.net/super005/article/details/5827298

(1)Thread的开销大,匿名线程不好管理。而AysnTask使用了高效的框架来管理。

(2)Thread中更新UI需要使用Handler来进行线程间通讯,非常麻烦。而AsynTask避免了这个麻烦,它在后台线程中运行,但回调函数是在主线程中执行的,因此可以直接将耗时操作放在线程后台中做,将更新UI的操作放在回调函数中。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">