美文网首页
关于MessageQueue.IdleHandler及使用方法

关于MessageQueue.IdleHandler及使用方法

作者: 代码改变人生 | 来源:发表于2019-10-20 12:20 被阅读0次

    MessageQueue.IdleHandler可以用来在线程空闲的时候,指定一个操作;有点类似Handler.postDelayed(Runnable r, long delayMillis),都是在将来的某一个时间执行一个操作。

    使用IdleHandler的好处在于可以不用指定一个将来时间,只要线程空闲了,就可以执行它指定的操作。比较适合那种需要在将来执行操作,但是又不知道需要指定多少延迟时间的操作。

    部分源码如下

     Message next() {
            ...一坨代码
            for (;;) {
                ...一坨代码
                if (msg != null) {
                    if (now < msg.when) {
                        ...省略
                    } else {
                        ...省略
                        return msg;
                    }
                }
                ...一坨代码
                // Run the idle handlers.
                // We only ever reach this code block during the first iteration.
                for (int i = 0; i < pendingIdleHandlerCount; i++) {
                    final IdleHandler idler = mPendingIdleHandlers[i];
                    mPendingIdleHandlers[i] = null; // release the reference to the handler
    
                    boolean keep = false;
                    try {
                        keep = idler.queueIdle();
                    } catch (Throwable t) {
                        Log.wtf(TAG, "IdleHandler threw exception", t);
                    }
    
                    if (!keep) {
                        synchronized (this) {
                            mIdleHandlers.remove(idler);
                        }
                    }
                }
                ... 省略
            }
        }
    

    Activity启动优化

    onCreate,onStart,onResume中耗时较短但非必要的代码可以放到IdleHandler中执行,减少启动时间

    @Override
    protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
    
     // ...
    
     // 拿到主线程的MessageQueue
     Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
    
     @Override
     public boolean queueIdle() {
      // 在这里去处理你想延时加载的东西
      delayLoad();
    
      // 最后返回false,后续不用再监听了。
      return false;
     }
     });
    }
    

    相关文章

      网友评论

          本文标题:关于MessageQueue.IdleHandler及使用方法

          本文链接:https://www.haomeiwen.com/subject/porxyctx.html