Android面试-异步消息处理机制


>>> Handler:{
    什么是handler、handler的使用方法、handler机制的原理、handler引起的内存泄漏以及解决办法<非静态内部类使用外部类的引用造成的。>
    没法在子线程创建Handler:需要一个消息队列来保存它发送的消息,而默认子线程中是没有开启Looper轮询器的,而消息队列又是通过Looper来管理的。在子线程中创建Handler是没有关联到MessageQueue,来让你存储消息,会抛出异常。如果想在子线程中创建一个Handler,你必须自己去初始化一个looper,然后在通过Looper.loop开启一个循环,才能创建Handler。

===什么是handler:[
    主线程也称UI线程,不是线程安全的,是Android消息机制的上层接口。
    handler通过发送和处理Message和Runnable对象来关联相对应线程的MessageQueue。
    1、可以让对应的Message和Runnable在未来的某个时间点进行相应处理。
    2、让自己想要处理的耗时操作放在子线程,让更新ui的操作放在主线程。
]

===handler的使用:[
    1、post(runnable):底层调用的还是sendMessage,进行了一层封装。
--->post(runnable):
    private Handler uihandler = new Handler();
    uihandler.post(runnable);
    2、sendMessage(message)

--->sendMessage实例:
    private Handler uiHandler = new Handler(){
           private void handMessage(Message msg){
                switch(msg.what){ case 1: ...... break; }
            }
    }
    Message msg = new Message();
    msg.what = 1;
    uihandler.sendMessage(msg);
]

===handler机制的原理:[
---Looper:有一个mQueue消息队列,Android每个线程有单独唯一的Looper。loop()方法创建一个死循环,通过prepare()创建Looper。
---MessageQueue:有一个mMessage消息
---Message:有一个Handler对象
---Handler:有mQueue和mLooper对象。一定要在主线程而不能在内部类中创建Handler。作用是接收发送消息,还有就是处理消息。
1、Looper取出对头Message
2、对应的Handler执行handleMessage
3、返回Looper继续执行
]

===handler引起的内存泄漏以及解决办法:[ 
    Activity有Handler实例的引用,Handler在做耗时操作一直存在,Activity没法销毁。
    A、原因:非静态内部类持有外部类的匿名引用,导致外部activity无法释放。
    B、解决办法:handler内部持有外部activity的弱引用,并把handler改为静态内部类,mHandler.removeCallback()。
]

}

>>> Asynctask:{
    什么是AsyncTask、AsyncTask的使用方法、AsyncTask内部原理、AsyncTask的注意事项

===什么是Asynctask:[
    是Android提供的轻量级的异步类,是一个抽象类。它本质上就是一个封装了线程池和handler的异步框架。需要注意的是它只能做一些耗时比较短的操作。
]

===Asynctask的使用方法:[
1、三个参数:extends<参数1,参数2,参数3>
    参数1:传入的参数
    参数2:需要在界面上显示当前的进度
    参数3:结果返回参数类型
5、5个方法
    onPreExecute():UI线程中调用的,未开始之前做初始化操作。
    doInBackground(...):在子线程中运行,做一些较短时间的耗时操作。传递给onPostExecute。publishProgress(i);
    onProgressUpdate(...):进度更新
    onPostExecute(...):操作结束。接收doInBackground返回的值。
    构造方法:
]

===Asynctask机制原理:[
1、AsyncTask的本质是一个静态的线程池,AsyncTask派生出的子类可以实现不同的异步任务,这些任务都是提交到静态的线程池中执行。
2、线程池中的工作线程执行doInBackground(mParams)方法异步任务
3、当任务状态改变之后,工作线程会向UI线程发送消息,SayncTask内部的IntentnalHandler相应这些消息,并调用相应的回调函数。
]

===AsyncTask注意事项:[
1、内存泄漏
    声明为非静态内部类,会持有外部类的匿名引用,外部类无法被回收。
    A、可以把AsyncTask设置成静态的
    B、在AsyncTask中持有Activity的弱引用
    C、onDestroy()进行AsyncTesk的finish操作 cancel方法调用。
2、生命周期
    生命周期不会依附于Actiivty的生命周期,要主动调用cancel方法,可在Activity关闭前导致崩溃:子线程在运行,更新UI而界面不存在。
3、结果丢失
    屏幕旋转或Activity退到后台、内存不够被杀掉,而Activity重新被创建,原来的见面失效,去更新界面就不会生效。
4、并行or串行
    1.6之前都是串行,有序执行;1.6到2.3改成并行;在2.3之后为维护系统的稳定,又改成了串行,但是还是可以执行并行<线程池执行方式>,如果采用并发,系统线程是不稳定的。
]

}

>>> handlerThread:{
    handlerThread是什么、handlerThread源码解析

===handlerThread产生背景:[
    开启Thread子线程进行耗时操作,多次创建和销毁线程是很消耗系统资源的,影响性能。采用循环线程,使其执行多个耗时任务。handler+thread+looper      是一个thread内部有looper
]

===handlerThread的特点:[
    HandlerThread本质上是一个线程类,它继承了Thread;
    HandlerThread有自己的内部Looper对象,可以进行looper循环;
    通过获取HandlerThread的looper对象传递给Handler对象,可以在handlerMessage方法中进行异步任务。
    有点是不会有阻塞,减少了对性能的消耗,缺点是不能同时进行多任务的处理,需要等待进行处理。处理效率低。
    与线程池注重并发不同,HandlerThread是一个串行队列,HandlerThread背后只有一个线程。
]

===handlerThread源码解析:[
    
]

}

>>> intentservice:{
    intentservice是什么、intentservice的使用方法、intentservice源码解析
    继承Service,但优先级比Service高。内部封装了Handler和HandlerThread

===intentService是什么:[
    IntentService是继承并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统的Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们手动去控制或stopSelf()。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次会执行一个工作线程,执行完第一个再执行第二个。
    它本质是一种特殊的Service,继承自Service并且本身就是一个抽象类。
    它内部通过HandlerThread和Handler实现异步操作。
]

===intentService的使用:[
    继承IntentService
    /**
    实现异步任务的方法
    Activity传递过来的Intent,数据封装在intent中
    */
protected void onBandleIntent(Intent intent){ //Message实现消息传递 }
    A、创建IntentService是时,只需实现onHandleIntent和构造方法,onHandleIntent为异步方法,可以执行耗时操作。

]

===intentservice源码解析:[
public abstract class IntentService extends Service {
//构造方法
public IntentService(String name) {
//回调方法
protected abstract void onHandleIntent(@Nullable Intent intent);
---onCreate():会创建一个HandlerThread 
        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);   拥有执行异步线程的Looper,就可以执行异步任务。
---onHandleIntent(@Nullable Intent intent):抽象方法,是一个异步方法
--- stopSelf(msg.arg1);  //有参数的情况,时候等到所有消息传递后销毁
    它本质上就是一个封装了HandlerThread和handler的异步框架。
]

}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值