1、Android开发中使用多线程的原因
- 避免ANR(Application is not responding)
- 实现异步,比如从云端获取图片比较费时,不应该使用同步阻塞获取结果,使用异步加载完成一个刷新一个
(这种要用到线程池?)
- 多任务,比如多线程下载
2、同步和异步的理解
有些事件必须使用同步比如用户的注册,需要得到结果后才能进行下面的操作,有些事件需要异步,比如微博的点赞,只需要点赞完成后提示我一下就行了,没必要在与服务器沟通的过程中采用同步处理不可以干其他的事情。
3、线程间通信
需要处理耗时操作,可以新建一个子工作线程HandlerThread,也可以直接通过new Thread创建一个新的子线程
- 新建一个子工作线程HandlerThread
HandlerThread handlerThread = new HandlerThread("Handler Thread");
handlerThread.start();
Handler workderHandler = new Handler(handlerThread.getLooper(), new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
//运行在工作线程(子线程)中,用于实现自己的消息处理
return true;
}
});
HandlerThread应用场景
HandlerThread比较适用于单线程+异步队列的场景,比如IO读写操作数据库、文件等,耗时不多而且也不会产生较大的阻 塞。对于网络IO操作,HandlerThread并不适合,因为它只有一个线程,还得排队一个一个等着。
这里单线程+异步队列模型的使用场景还举几个例子:
1. 应用刚启动时的数据初始化操作,如果开启多个线程同时执行,有可能争夺UI线程的CPU执行时间,造成卡顿,而使用该模 型,通过设置优先级就可以将同步工作顺序的执行,而又不影响UI的初始化;
2.从数据库中读取数据展现在ListView中,通过Handler的postAtFrontOfQueue方法,快速将读取操作加入队列前端执行,必 要 时返回给主线程更新UI;
3.HandlerThread应用在IntentService中,IntentService是一个需要长时间执行任务Service,优先级要比线程高。
- 直接通过new Thread创建一个新的子线程
new Thread(new Runnable() {
public void run(){
xxxx; //做耗时操作
}
}).start();
new Thread应用场景(个人认为)
HandlerThread比较适用于单线程+单一操作的场景,耗时操作不需要循环进行,或者耗时操作比较少,不需要队列
- post和send的区别:(这里还是不太好理解,两者用法有什么区别?以后再继续看源码...)
send的方式:
post的方式:
参考文章:https://www.jianshu.com/p/43d6cd7b06f1
4、线程池的应用
new Thread的弊端
- 性能差
- 缺乏统一管理,无序竞争
- 无法定时定期执行
线程池的问题单独开一篇文章来学习...
5、AsyncTask类(可以在子线程和UI线程中跳转)
解决使用Handle较为繁琐
AsyncTask优点:简单,快捷
缺点:当有多个异步操作时并需要变更ui复杂
这个以后再详细了解...