Android IdleHandler基本使用及应用案例详解

 更新时间:2022年10月11日 15:30:49   作者:长安皈故里  
这篇文章主要为大家详细介绍了Android IdleHandler的基本使用及应用案例,文中的示例代码讲解详细,具有一定的参考价值,需要的可以参考一下

IdleHandler基本使用

IdleHandler原型

public static interface IdleHandler {
    boolean queueIdle();
}

不看源码直接上结论,Android应用的运行都是靠着一条条Message入队、出队、执行实现,当应用主线程的消息队列空闲的时候(消息队列没有消息或下一次消息执行的时间还未到),就会尝试去执行IdleHandler集合。

其中:IdleHandlerqueueIdle方法的返回值如果为false,那么IdleHandler执行完之后就会被移除,也就是说只会被执行一次;如果返回值为true,不会被移除且可以被执行多次。

所以我们就可以向消息队列的IdleHandler集合中插具体的IdleHandler在应用主线程空闲的时候执行一些操作,基本的使用如下:

Looper.getMainLooper().queue.addIdleHandler {
    true
}

案例1:执行GC

大家都知道,不能随便在主线程执行GC,否则很容易造成卡顿,但是我们可以在主线程空闲的时候去执行GC,这个时候就可以利用IdleHandler,Android源码中就有如下使用:

#ActivityThread
void scheduleGcIdler() {
    Looper.myQueue().addIdleHandler(mGcIdler);
}

final class GcIdler implements MessageQueue.IdleHandler {
    @Override
    public final boolean queueIdle() {
        doGcIfNeeded();
    }
}

void doGcIfNeeded(String reason) {
     //执行GC
     BinderInternal.forceGc(reason);
}

这样既可以满足gc回收对象的需要,又不会影响主线程中其他任务的执行

案例2:粗估Activity界面渲染时间

我们首先要明确界面渲染流程是发生在Activity的onResume生命周期,往主线程消息队列添加消息屏障(之后添加的Message只能执行异步类型的),然后发送界面渲染异步Message,等到界面渲染完成后才会从消息队列移除屏障消息,这个时候才能正常执行其他Message。

参考下滴滴的DoKit开源库:

我们现在onResume方法中记录界面开始渲染时间,添加一个IdleHandler,这个会在界面渲染相关Message执行完毕后再执行它,所以就可以简单的估算出界面渲染时长。

案例3:App大图监测

常见的大图监控方法都是将ImageView替换成自定义ImageView,然后重写设置图片的方法,比如setImageBitmap()等等,在方法中计算下图片的宽高是否超过ImageView的宽高,是就弹出一个弹窗提醒开发者,一般在Debug环境下执行这种检测。

Debug环境下开启大图检测,一般为了避免影响主线程其他任务执行,都会添加一个IdleHandler等主线程空闲了再去执行大图检测:

案例4:延迟启动初始化任务

一般我们都在ApplicationonCreate方法中执行任务(比如第三方SDK)的初始化,可是如果执行的初始化任务过多就会增加启动耗时,给用户带来较差体验。

而且有的任务并不是一定就需要在ApplicationonCreate就必须要执行,可以延迟初始化,减少应用启动耗时,这个时候就可以把相关延迟任务添加到一个Idlehandler中去执行。

到此这篇关于Android IdleHandler基本使用及应用案例详解的文章就介绍到这了,更多相关Android IdleHandler内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android实现上传头像

    Android实现上传头像

    这篇文章主要为大家详细介绍了Android实现上传头像,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Android逆向技巧——去除开屏广告

    Android逆向技巧——去除开屏广告

    这篇文章主要介绍了Android如何去除开屏广告,帮助大家更好的理解和学习使用Android开发,感兴趣的朋友可以了解下
    2021-04-04
  • Android ViewPager循环播放广告实例详解

    Android ViewPager循环播放广告实例详解

    这篇文章主要介绍了Android ViewPager循环播放广告条实例详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • photoView实现图片多点触控效果

    photoView实现图片多点触控效果

    这篇文章主要为大家详细介绍了photoView实现图片多点触控效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Android 实现签到足迹功能

    Android 实现签到足迹功能

    这篇文章主要介绍了Android 实现签到足迹功能的示例,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下
    2021-04-04
  • Android应用开发中Fragment间通信的实现教程

    Android应用开发中Fragment间通信的实现教程

    这篇文章主要介绍了Android应用开发中Fragment间通信的实现教程,包括接口的定义实现与Fragment通信的动静态加载等,需要的朋友可以参考下
    2016-02-02
  • AndroidImageSlider实现炫酷轮播广告效果

    AndroidImageSlider实现炫酷轮播广告效果

    这篇文章主要为大家详细介绍了AndroidImageSlider实现炫酷轮播广告效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Android仿支付宝密码输入效果封装

    Android仿支付宝密码输入效果封装

    这篇文章主要为大家详细介绍了Android仿支付宝密码输入效果的封装,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Android控件拖动实例详解

    Android控件拖动实例详解

    这篇文章主要介绍了 Android控件的拖动实例详解的相关资料,这里附有实例代码,帮助大家学习理解,需要的朋友可以参考下
    2016-12-12
  • 在android中使用缓存和脱机存储

    在android中使用缓存和脱机存储

    这篇文章主要介绍了在android中使用缓存和脱机存储,缓存可以加速你的应用程序,即使在网络不可用时,用户能够更加流畅地使用你的应用程序使用缓存是相当简单的,需要一个单一的代码行,下面来看看文章的详细内容
    2021-11-11

最新评论