关于Handler在异步更新UI作用的一些理解

    最近在做项目的时候,出现了一个问题,我开发的应用使用的是一个Naviagtion Drawer进行页面转换,如图

但是在测试的过程中出现了一个很怪的问题,每次我进行Fragment替换的时候,Drawer总是在收回的时候卡一下,刷新出的Fragment也会很自觉的卡一下,而且即使在高端机上也有这个现象,只不过比较轻微,于是我就去跟踪代码,发现我是这样写的

1.点击某一个选项

2.Fragment替换

3.Drawer收回

难道是因为先进行替换后收回的缘故?然后我把顺序改成

1.点击某一个选项

2.Drawer收回

3.Fragment替换

结果还是TMD卡,我很无语。

一怒之下,我索性把Fragment替换删掉了,就剩一个大白屏,结果居然奇迹般的不卡了。

看来Fragment替换是一个挺费时间的操作,但是我又不能新开一个线程取更新,因为非UI线程不能更新UI,这可怎么办。

灵机一动,我想既然Fragment和Drawer同时操作会卡,那能不能让Fragment等待Drawer收回之后再更新呢,但是我也不能直接用一个Delay加载Fragment替换前面,因为这样同样会阻塞UI线程,看来只能用异步更新。

于是,我弄了个Handler,挂在主线程的Looper上,在进行Fragment替换的时候,我先往handler发一条延时250ms的消息,然后再在handleMessage里进行替换Fragment,这样Drawer在250ms内完成收回,然后才进行Fragment替换,虽然总时间没变甚至增加,但是却提供了一个很好的用户体验,最后的过程是这样

1.点击某一个选项

2.Drawer收回

3.handler.sendEmptyMessageDelayed(0, 250);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值