你的位置:首页 > 软件开发 > 操作系统 > Android中使用Thread线程与AsyncTask异步任务的区别

Android中使用Thread线程与AsyncTask异步任务的区别

发布时间:2016-06-19 17:00:11
最近和几个朋友交流Android开发中的网络下载问题时,谈到了用Thread开启下载线程时会产生的Bug,其实直接用子线程开启下载任务的确是很Low的做法,那么原因究竟如何,而比较高大上的做法是怎样?于是用这篇博文详细分析记录一下。一、概念介绍  Thread是指在CPU运行的一 ...

  最近和几个朋友交流Android开发中的网络下载问题时,谈到了用Thread开启下载线程时会产生的Bug,其实直接用子线程开启下载任务的确是很Low的做法,那么原因究竟如何,而比较高大上的做法是怎样?于是用这篇博文详细分析记录一下。

一、概念介绍

  Thread是指在CPU运行的一个程序中,可以有多个执行路径。运行的程序称作进程,而这个执行路径,就被称为线程(如果对这两个名词不太理解的同学可以参考一下操作系统方面的书籍)。Java中的多线程是指多个Thread可以在一段内同步执行,这样可以提高代码的运行效率,Java中允许一个进程有多个线程,可以无限多,但是必须要有一个线程,也就是当前进程的主线程。

  必须要明白的一点是,Thread是Java语言下的一个底层类,而Android是使用并封装了Java语言的系统,所以Android中的AsyncTask只是使用了Java的多线程概念并优化封装之后的一个抽象类。所以Thread和AsyncTask完全是两个不同层次的概念,而不是简单的替换。

  再说说AsyncTask异步任务,这个类是在Android中使用的,在编写该类时就已经明确说明,“AsyncTask is designed to be a helper class around {@link Thread} and {@link Handler} and does not constitute a generic threading framework. 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”,后边的不重要就不用粘贴了,可以看出异步任务进行长时间操作时使用的。因为Android中对每一个App的运行都看做一个进程,而这个进程中的主线程,就是UI线程,也就是我们打开一个App时可以看到界面的这个线程。而像下载这种耗时操作,如果放到UI线程执行,则会使得UI线程负荷过大产生ANR应用无响应异常,所以创建了AsyncTask类,用来专门进行一些耗时的非UI更新操作。

  通过上面的介绍,很容易想到AsyncTask是使用了Java中的多线程技术的,但是他不是单纯的Thread,具体是怎么实现异步任务的,我们可以看源码比较。

   Thread类是在java.lang包下的,所以他的使用不需要另外导包,而且Thread是实现Runnable接口的类,也就是说他可以实例化;由于Thread是底层代码,具体源码就不再分析了,所以主要说一下AsyncTask怎么用Thread实现的异步任务。

  AsyncTask类是在android.os包下的抽象类,在使用之前必须导包。AsyncTask是使用线程工厂创建新的线程在后台执行异步任务的,之前我们说个Android中有一个UI线程作为主线程,那么再创建的线程都是子线程了,至于新创建的这些子线程做了什么事情,就要看我们的意愿了。

二、下载分析:

  介绍了半天两个类的对比,感觉还是直接上Demo来的快一点。下边我分别用开启子线程和开启异步两种方式实现下载,同时简单分析一下这两种方式下的CPU执行顺序。

  1. 在当前Activity中开启子Thread执行下载

(1)创建下载子线程:

 1 /** 2    * 下载线程 3   */ 4   private Thread myThread =new Thread(new Runnable() { 5     @Override 6     public void run() { 7       Object data=download(PATH); 8       Message msg=Message.obtain(); 9       msg.what=101;10       msg.obj=data;11       handler.sendMessage(msg);12     }13   });

原标题:Android中使用Thread线程与AsyncTask异步任务的区别

关键词:Android

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录