0
点赞
收藏
分享

微信扫一扫

Android面shi超级攻略,全面攻破技术疑难及痛点MK

需要课程请查看主页置顶文章


线程相关

Linux线程基础

线程与进程的区别

线程同步

Linux线程通讯方式

ANR

Android面shi超级攻略,全面攻破技术疑难及痛点MK_封装

- 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

以上这些重点都是需要记住的。

举报

相关推荐

0 条评论