在MessageQueue
类中定义了一个公开静态接口,即IdleHandler
:
public static interface IdleHandler {
/**
* Called when the message queue has run out of messages and will now
* wait for more. Return true to keep your idle handler active, false
* to have it removed. This may be called if there are still messages
* pending in the queue, but they are all scheduled to be dispatched
* after the current time.
*/
boolean queueIdle();
}
上面的注释的内容大致为:
- 当消息队列中没有消息,可以使用
IdleHandler
来等待消息; - 返回
true
表示这个IdleHandler
是激活的,表示一直可以调用,也就是在下次CPU
空闲的时候将会调用; - 返回
false
表示移除这个IdleHandler
,也就是只调用一次; - 如果消息队列中有消息,并且这些消息计算在当前时间之后发送,可以调用
IdleHandler
;
在做启动页的时候,我们可以很粗暴的使用handler
来发送一个延迟的消息来做到。但是因为手机性能不同,可能加载时间略有不同。比如:
Handler mHandler = new Handler();
// 5秒后启动主页
mHandler.postDelayed(() -> {
Intent intent = new Intent();
intent.setClass(this, MainActivity.class);
}, 5000);
因为延迟启动主要是想在这个时间之内后台完成一些操作,使得页面更加流畅。所以不同设备的时间其实应该不一样。
使用:
这里还是以Glide加载网络上的视频的第一帧图片为例:
// View
ImageView image = findViewById(R.id.image);
Looper looper = Looper.myLooper(); // ActivityThread
MessageQueue queue = looper.getQueue();
queue.addIdleHandler(new MessageQueue.IdleHandler() {
@Override
public boolean queueIdle() {
// 使用Glide加载图片
Glide.with(MergeTestActivity.this)
.asBitmap()
.load(Uri.parse("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"))
.thumbnail((float) 0.3)
.error(R.drawable.aii)
.transition(BitmapTransitionOptions.withCrossFade())
.into(image);
// 只需要启动一次,返回false
return false;
}
});
结果: