消息机制及异步任务相关知识点

简介

精简的语言总结概括了【Handler】【AsyncTask】【HandlerThread】【IntentService】的机制原理,方便大家横向比较。如果需要详细的源码解析,网上有很多资料,请自行搜索。

Handler消息机制

在子线程中,进行耗时操作,执行完操作后,发送消息,通知主线程更新UI。
消息机制主要包含:MessageQueue,Handler和Looper这三大部分,以及Message

 1.每个线程只能有一个Looper,主线程不需要创建,子线程需要单独创建。Looper保存在ThreadLocal中(本地线程存储区)
 2.子线程中把数据放入Message中,并通过Handler发送给Looper里维护的消息队列MessageQueue,Looper里有一个死循环,用来从消息队列中读取消息,然后根据Message中记录的对应的Handler信息,把Message发送给Handler来处理。

事件传递机制

事件传递关系到的几个对象
Activity dispatchTouchEvent()
PhoneWindow dispatchTouchEvent()
DecorView( ViewGroup ) dispatchTouchEvent() onInterceptTouchEvent()
View dispatchTouchEvent() dispatchTouchEvent()
手指点击屏幕的那一刻,就会触发Activity的dispatchTouchEvent(),然后会依次调用PhoneWindow、DecorView的dispatchTouchEvent() ,在ViewGroup的dispatchTouchEvent()里面会先调用 onInterceptTouchEvent() ,如果拦截就会调用当前ViewGroup的onTouch() onTouchEvent()…等方法。如果没有拦截就遍历子View,然后执行View的dispatchTouchEvent()方法,如果被消费了就调用该View的onTouch() onTouchEvent()…等方法。没被消费就一级一级往回返状态。如果都没有消费,最终在Activity废弃这个事件

AsyncTask

AsyncTask主要是onPreExecute() doInBackground(Params…) onPostExecute(Result)三个方法,如果更新进度还有publishProgress(Progress…) onProgressUpdate(Progress…)方法。除了 doInBackground(Params…) 执行在子线程,其他都在主线程执行。
【使用中注意的问题】

1.生命周期:AsyncTask不与任何组件绑定生命周期,所以在Activity/或者Fragment中创建执行AsyncTask时,最好在Activity/Fragment的onDestory()调用 cancel(boolean);
2.内存泄漏:如果AsyncTask被声明为Activity的非静态的内部类,那么AsyncTask会保留一个对创建了AsyncTask的Activity的引用。如果Activity已经被销毁,AsyncTask的后台线程还在执行,它将继续在内存里保留这个引用,导致Activity无法被回收,引起内存泄露。
3.结果丢失:屏幕旋转或Activity在后台被系统杀掉等情况会导致Activity的重新创建,之前运行的AsyncTask(非静态的内部类)会持有一个之前Activity的引用,这个引用已经无效,这时调用onPostExecute()再去更新界面将不再生效。

HandlerThread

HandlerThred是一个线程,在调用线程start()之后的run()里得到的当前线程的Looper,使用这个Looper创建的Handler的handlerMessage(Message)用于处理后台任务,处理完之后再交给主线程中的Handler来更新UI.
但是由于HandlerThread有自己的队列来处理任务,所以只能串行执行任务。
HandlerThread适合单线程+异步队列的场景,耗时不多,并且并发小的任务。如IO读写操作。至少比频繁开关线程要性能消耗少。
关闭HandlerThread有安全的关闭方法和不安全的关闭方法。安全的:判断是否有任务还在执行,没有的话就关闭。 不安全:不检查是否偶任务,全部关闭。

IntentService

在这里插入图片描述
因此我们通过复写方法onHandleIntent(),再在里面根据Intent的不同进行不同的线程操作就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值