Android多线程编程小结

转载 2015年07月09日 17:01:53

      我们知道,Android系统为了提高程序的实时响应能力,不允许在UI线程中进行耗时的操作,否则会出现ANR异常,因此必须将耗时的任务放到非UI线程中执行。Android/Java提供了很多类来帮助大家完成异步操作,比如:Thread类,Timer类,AsyncTask类,HandlerThread类,以及Executor接口。这些类都分别在什么场合下使用呢?

本文简单地总结一下Android开发中常见的多线程类型和解决方案,并比较和分析了各个方案的区别,以便更好地理解和应用这些API接口。

1. 单项异步任务

[场景]:下载一个APK文件,拷贝一个大文件。

[方案]:Thread类,AsyncTask类

[比较]:AsyncTask提供了onProgressUpdate和onPostExecute通知调用者任务执行的进度和结果,在函数内可以直接执行UI操作。而Thread中不能直接操作UI界面,而要通过Activity.runOnUiThread或者借助Handler来完成UI的更新。所以Thread更适合执行一些不需要跟UI频繁交互的单项任务,而AsyncTask相反。

2. 定时/循环执行的任务

[场景]:定时刷新UI(如:秒表),保持TCP心跳连接。

[方案]:“Thread + sleep”,定时器Timer

[比较]:“Thread + sleep” 方案示例:

new Thread(new Runnable() {          
    @Override
    public void run() {              
	    while(!EXIT) {
		    Thread.sleep(1000);
		    mListener.onTimeArrived();
	    }               
    }
}).start(); 

两者都不能在循环中执行UI更新操作,而必须借助Activity.runOnUiThread或者Handler来完成UI的更新。
由于Thread方案中onTimeArrived()占用了部分时间,所以这种方案的定时并不准确,而Timer是由系统创建异步通知的定时器,会更加准确,所以推荐使用Timer来完成定时任务。

3. 工作线程

工作线程启动后处于一种等待“命令”/“消息”的休眠状态,当接收到“命令”/“消息”后,将它放入“命令”/“消息”队列,然后唤醒线程依次串行或者并行执行。

[场景]:“生产者--消费者”模式,TCP Server端命令处理程序

[方案]:“Thread + condition/lock” ,HandlerThread类,线程池Executor

[比较]:HandlerThread类是Android系统提供了封装好了Loop循环的Thread类,可以更加便捷地完成CallerThread和WorkThread的命令/消息交互。当然,我们也可以用Thread和Condition/Lock方式实现同样的效果,只不过要自己实现更多的代码。

前面的两种方式,都是“串行”的方式在执行“命令”,如果希望提供并发性,同时开启和管理多个线程来执行任务,则可以考虑使用Executor。

 

本文转自:http://ticktick.blog.51cto.com/823160/1564055

多线程编程小结

程序和进程 程序是计算机指令的集合,它以文件的形式存储在磁盘上。 进程:通常被定义为一个正在运行的程序的实例,是一个程序在其自身的地址空间中的一次执行活动。 进程是资源申请、...
  • persuper
  • persuper
  • 2007年08月10日 21:14
  • 445

iOS 多线程编程小结(三)

Run Loop Run Loop提供了一种异步执行代码的机制,不能并行执行任务 在主队列中,Main Run Loop直接配合任务的执行,负责处理UI事件、计时器,以及其它内核相关事件 Run...
  • SkySuperWL
  • SkySuperWL
  • 2016年08月06日 15:30
  • 180

iOS 多线程编程小结(二)

GCD——大中央调度 串行队列,同步任务,不需要新建线程 串行队列,异步任务,需要一个子线程,线程的创建和回收不需要程序员参与! “是最安全的一个选择”串行队列只能创建!并行队列,同步任...
  • SkySuperWL
  • SkySuperWL
  • 2016年08月06日 15:22
  • 188

Linux多线程编程小结

文章内容主要总结于《Linux程序设计第3版》。 1.Linux进程与线程        Linux进程创建一个新线程时,线程将拥有自己的栈(因为线程有自己的局部变量),但与它的创建者共享全局变量...
  • cuixingbing
  • cuixingbing
  • 2013年12月02日 19:32
  • 443

Linux多线程编程小结——干货

对于linux下的多线程而言,这里我们需要区分几个概念: 1、信号量 2、互斥变量(递归和非递归) 3、条件变量 4、共享锁(读写锁)(适用于读的次数远大于写的情况)   信号量(sem)...
  • xuziqu
  • xuziqu
  • 2015年08月22日 22:01
  • 723

linux:C++多线程编程小结

linux:C++多线程编程小结 mark: 在多线程中使用 cout打印输出时会出现乱序, printf则没有该现象. 参考:http://www.cnblogs.com/gnuhpc/...
  • boshuzhang
  • boshuzhang
  • 2017年03月07日 17:18
  • 78

多线程编程小结(一)

线程函数的介绍(pthread_create;pthread_join;pthread_exit;pthread_cancel) 线程与进程的区别 多线程的优点 分离线程的介绍...
  • skyroben
  • skyroben
  • 2017年05月28日 22:23
  • 184

android编程小结

1 UI方面   最重要的是两个ListView和GridView,Gallery也可以,但好像不如前两个用的多。三种View都可以用一个适配器,即从BaseAdapter继承而来的。也就是编好了一...
  • masofeng
  • masofeng
  • 2012年04月24日 08:50
  • 414

Linux多线程编程小结——入门级教程

http://blog.csdn.net/monkey_d_meng/article/details/5628663 版权声明:本文为博主原创文章,未经博主允许不得转载。 ...
  • STN_LCD
  • STN_LCD
  • 2017年06月08日 11:09
  • 127

Android的传感器编程小结

这两天结合手机研究了下Android的传感器编程,现做一个小结:(手机是G2 Magic,OS版本1.1) 传感器编程中,1. Accelrator的x,y,z轴的正负向:    手机屏幕向上水平放...
  • o2snake
  • o2snake
  • 2011年03月05日 18:00
  • 1310
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android多线程编程小结
举报原因:
原因补充:

(最多只允许输入30个字)