作用与LayoutInflater类似,区别在与AsyncLayoutInflater在子线程中完成View的创建,在通过callback将创建的视图返回。
核心方法:public void inflate(@LayoutRes int resid, @Nullable ViewGroup parent,@NonNull OnInflateFinishedListener callback)
流程大致如下:
- 首先创建一个请求(消息),发送给内部子线程mInflateThread; step 1
- 子线程mInflateThread内部执行while死循环,从阻塞队列mQueue中获取消息,并通过反射创建视图; step 2
-
如果在子线程中创建失败,则尝试在主线程创建,并将最终结果传递给callback;
step 3
使用AsyncLayoutInflate主要有如下几个局限性:
- 所有构建的View创建过程中不能使用限定主线程的函数,如直接使用 Handler 或者是调用 Looper.myLooper();
- 异步转换出来的 View 并没有被加到parent视图中,AsyncLayoutInflater 是调用了LayoutInflater.inflate(int, ViewGroup, false),因此如果需要加到 parent视图中,还需要再手动添加;
- 不支持设置 LayoutInflater.Factory 或者LayoutInflater.Factory2;
- 缓存队列默认大小为10 ,超过了10个则会导致阻塞主线程。
2020-02-21
网友评论