需要课程请查看主页置顶文章
线程相关
Linux线程基础
线程与进程的区别
线程同步
Linux线程通讯方式
ANR
- what
- Activity 5s内无响应,BroadcastReceiver 10s内无响应
- /data/anr/traces.txt 文件记录了ANR的信息
- why
- how
耗时任务或者线程间通讯
AsyncTask
本质上是对 ThreadPool 和 Handler 的一个封装
默认是串行的执行任务,可以调用executeOnExecutors()方法并行执行任务
Handler
IntentService
Handler
Handler + MessageQueue + Looper
MessageQueue本质上是一个单链表,不是Queue。采用FIFO方式管理,enqueueMessage()方法是将消息插入一条队列,next()方法是一个无限循环的方法。如果有消息,则取出,如果没有,就阻塞。
HandlerThread
本质上是一个继承了Thread的线程类。
通过创建HandlerThread**获取looper对象,传递给Handler对象,执行异步任务。在HandlerThread中通过**Looper.prepare()来创建消息队列,并通过Looper.loop()来开启消息循环。创建HandlerThread后必须先调用start()方法,才能调用getLooper()获取Looper对象。
HandlerThread封装了Looper对象,使我们不用关心Looper的开启和释放的细节问题。如果不用HandlerThread的话,需要手动去调用Looper.prepare()和Looper.loop()这些方法。
IntentService
原理:IntentService是一个抽象类,封装了HandlerThread和Handler,负责处理耗时的任务。任务执行完毕后会自行停止。在onCreate()方法中开启了一个HandlerThread线程,之后通过HandlerThread的Looper初始化了一个Handler,负责处理耗时操作。通过startService()方法启动,在handler中调用抽象方法onHandleIntent(),该方法执行完成后自动调用stopself()方法停止
override onHandleIntent() 方法
优点:一方面不需要自己去创建线程,另一方面不需要考虑在什么时候关闭该Service
OOM
what
OOM 和 内存泄漏 的区别
how
静态变量持有Activity或Context对象
非静态内部类的实例(默认持有外部类的引用)
资源未关闭:file、stream、bitmap等
Handler造成OOM
原因:使用(匿名)内部类实例化handler,默认持有context引用
避免:静态内部类、Activity在onDestroy的时候,清空handler未处理的消息
WebView造成OOM
以上这些重点都是需要记住的。