目录
Handler,相信做Android开发的小伙伴对他都不陌生了。
起初,我也是浮于表面的理解和学习(虽然现在也还是没有太深入,但有种比以前好了一些的感觉),慢慢地发现他竟然在Android中到处都可见。
所以今天分享出来我的一些总结,抛砖引玉,帮助更多人,同时也希望有更多动力去深入。
下面我们来说说他吧~
对一个陌生事物了解,首先从概念开始。
简单说,Handler机制是Android中提供的一种异步回调机制,处理子线程和主线程之间的通信。
涉及到相关重要类及职责是:
1)Handler:负责发送处理消息.
2)MessageQueue:消息队列,负责存储消息.
3)Message:具体发送的消息.
4)Looper:负责循环取出消息给Handler处理.
5)ThreadLocal:用于线程间的数据隔离,每个线程中存放各自对应的looper.
机制运作总结:子线程中Handler将消息发送到MessageQueue中,然后Looper不断的从MessageQueue中读取消息并调用Handler.dispatchMessage发送消息,最后Handler处理消息。
当然内部机制详细内容仍然要详细追寻源码来发现其中的更多奥秘,这里就不展开说了。
通常我们使用Handler可以去刷新界面,可以去制作定时器等等,但没想到他竟然也跟ANR、内存泄露有着关系。那我们一起再看下去吧。
ANR异常:Application Not Response 应用程序无响应 。出现这个异常时,会为用户弹出交互式弹窗,影响用户使用和体验。
产生ANR异常的原因:在主线程执行了耗时操作,对Activity来说,主线程阻塞5秒将造成ANR异常,对BroadcastReceiver来说,主线程阻塞10秒将会造成ANR异常。
Handler是线程间通讯的机制,Android中,网络访问、文件处理等耗时操作必须放到子线程中去执行,否则将会造成ANR异常。
解决ANR异常的方法:耗时操作都在子线程中去执行 但是,Android不允许在子线程去修改UI,可我们又有在子线程去修改UI的需求,因此需要借助Handler。
内存泄露:没有用的对象资源仍与GC-Root保持可达路径,导致系统无法回收。
一般造成的原因:
1)非静态内部类默认持有外部类的引用,比如非静态Handler持有Activity引用
2)接收器、监听器的注册没有取消,比如广播、EventBus
3)Activity的Context造成的
4)资源文件没有关闭造成的
等等,还有很多。
我们可以看到Handler的使用不当也会导致内存泄露问题。
知道了之后,我们使用的时候就可以有的放矢、游刃有余的关注和解决了。
- public class MyActivity extends Activity{
-
- //在Activity中 声明一个静态的Handler内部类 并持有外部类的弱引用
- private static class InnerHandler extends Handler{
-
- private final WeakReference
mActivity; -
- public InnerHandler(MyActivity activity){
- mActivity = new WeakReference
(activity); - }
-
- @Override
- public void handlerMessage(Message msg){
- MyActivity activity = mActivity.get();
- if(activity!=null){
- //...
- }
- }
- }
-
- private final InnerHandler mHandler = new InnerHandler(this);
-
- private static final runnable = new Runnable(){
-
- @Override
- public void run(){
- //...
- }
-
- };
-
- @Override
- protected void onCreate(Bundle savedInstanceState){
- super.onCreate(savedInstanceState);
-
- //延时发送消息
- mHander.postDelayed(runnable,1000*60*5);
- }
- }
当然其中涉及到了弱引用的使用,可以自行了解相关内容。
这样串联下来,对Handler是否有了一个更全面的认识呢?
相信让Handler更充盈了一些。当然他不止这些。还需要我们更深入更广度的挖掘。探究内部原理,发现其中奥秘。
--------------------------------------------------------------------------
如有不妥之处,望见谅。提供您的宝贵建议、意见,我会积极改正的。
码字不易,如您喜欢欢迎收藏、点赞等支持,您的支持是我最大的动力!
后续有新文章的发布,欢迎持续关注。谢谢❤
也欢迎关注关注我的掘金博客 摩羯座程序媛 的个人主页 - 动态 - 掘金