一切和屏幕更新相关的都是handler处理的
线程创建
所有的jvm语言都是jvm来调度的
继承thread
new,thread().statr();
实现runnadle
new,thread(new,runnadle()).statr();
主线程和子线程
每个应用启动的第一条线程就是主线程
在android中,ui线程就是主线程.main线程
android的两条规定
主线程不允许使用网络
了线程不允许更改ui
因为网络请求时间不等,其实所有的延迟任务都不应该放在主线程,因为会卡主线程的,导致anr异常
anr异常
应用程序ui现成堵塞5秒以上.就会出现anr
所有阻塞方法(键盘输入,线程休眠,线程暂停,流,无限循环
如何处理anr异常
将耗时任务放入子线程中执行
handler通信
在不同的线程中传递信息,能做到任何线程间通信
一般都是实现子线程刷新ui
在activty中直接runonuithread方法就可以将runnable放入线程中执行
内部就是使用handler来完成的
四种启动模式
view的事件分民机制
android线程通信机制
looper循环者
looper线程
是一个无线循环的线程,调用looper.prepare()方法将一个普通线程提升到循环者,提升到循环者后,会添加一个messagequeue的消息队列,在调用looper.loop()方法,无限循环来炎messagequeue取消息,转发给发送消息的handler来处理
messagequeue
消息队列,先进先出
message
一个消息的抽象描述,可以包含一个对象,或者一个任务.
提供了两个int字段,用于存放int值
提供一个what字段,用来区分消息是谁发送的
提供一个object字段,用来存储一个对象(序列化)
提供一个runnable字段,用来存储一个任务
message一般不用new出来.而是通过handler对象来取出
handler
handler用来发送消息,必须绑定一个looper中的messagequeue,不管在哪条线程发消息,总是发送到他绑定的消息队列中,循环则将消息取出来之后,在送给发消息的handle处理,这时候已经完成了线程通信
handler的方法
发送空消息(只包含一个what字段),延迟,在某个时间(也会封装成一个message只不过只不过只有一个what而已)
发送消息(包含一个message对象)延迟,某个时间
执行一个任务(延迟执行;
//取消洗牌或者任务
handber.removemessage(what);
handler.removecallback(runnable);
子线程修改ui了
only.the.original.thread.that.creaed.a.view.hierarchy.can.touch.its.views
//eventbus
//rxjava->reandroid
asynctask
//我非常讨厌用他,sdk中到处都是这个
轻量级的异步处理任务
asynctask类有三个泛型参数,有5个重用方法,有一个必须的方法
asynctask<任务参数,进度参数 ,返回参数>
//我要去下载一张图片
//”图片地址就是参数,下载多少呢就是进度返回bitmap就是返回参数
int-integer void-void
onpreexecute()主线程
doinbackground()子线程
如果在2个调用publishprogress,就会执行onprogressupdate()方法
onpostexecute();任务执行完毕
//有什么bug呢
4.4之前有bug,任务最大128个
遍历本地图片,显示在gridview中
线程池
4种线程池
固定
executors.newfixedthreadpool(并发数);
定时器
executors.newscheduledthreadpool()和timer差不多,精准一点
缓存
executors.newcachedthreadexecutor()缓存的.重用
单个
executors.newsinglethreadexecutor()单个任务列队
加入一个任务
execute(runnable);
关闭线程池
shutdown();当前还有的任务全部会执行,不会再加入新的任务