AsyncLayoutInflater的简单介绍和源码分析

AsyncLayoutInflater是Google在Support v4包中提供的异步布局加载工具,用于避免因XML布局复杂导致的UI线程卡顿。它在非UI线程加载布局,然后通过回调将结果同步到UI线程。使用时需要遵守特定限制,例如不支持包含Fragments的布局。文章还深入源码,解析其工作原理,包括ArrayBlockingQueue实现的“生产者-消费者”模型和优化的LayoutInflater子类。
摘要由CSDN通过智能技术生成

简介

我们知道setContentView()、layoutinflater.inflate()等传统的布局加载方式都是在UI线程中同步加载布局的。当layout.xml过于复杂繁重,加载就会造成UI卡顿甚至ANR。在Google最近发布的Supportv4包中,给我们提供了一个异步加载布局的帮助类:AsyncLayoutInflater。这个类可以帮助你在非UI线程中加载layout,然后将加载好的布局通过接口回调的形式同步给UI线程。这个帮助类将会允许你的UI线程在执行繁重的inflate时继续保持响应。

使用方式

new AsyncLayoutInflater(this).inflate(
                                     R.layout.activity_main,
                                     null,
                                     new AsyncLayoutInflater.OnInflateFinishedListener() {
            @Override
            public void onInflateFinished(View view, int resid, ViewGroup parent) {
                //Do something with view
            }});

对比一般的加载方式

View  result = LayoutInflater.from(this).inflate(R.layout.activity_main, null);

可以看出,二者在用法上几乎唯一的区别就是AsyncLayoutInflater比LayoutInflater多了一个用于通知加载完成的回调。

限制条件

1、 parent的 generateLayoutParams() 函数必须是线程安全的。

2、 所有正在构建的views一定不能创建任何 Handlers 或者调用 Looper.myLooper 函数。

3、 不支持设置LayoutInflater.Factory也不支持LayoutInflater.Factory2

4、 不支持包含Fragments的inflatinglayouts

如果我们尝试异步的方式去inflate的layout

AsyncLayoutInflater是一个用于异步加载布局的工具类。它可以在后台线程中加载布局文件,并在加载完成后通过回调函数将结果返回给主线程。\[1\]使用AsyncLayoutInflater的步骤非常简单,只需要在onCreate方法中创建AsyncLayoutInflater实例,并在回调函数中进行布局的初始化操作,最后通过setContentView方法设置加载完成的布局。\[2\]在AsyncLayoutInflater源码中,可以看到它维护了一个LayoutInflater、一个用于将事件回调给原线程的Handler,以及一个用来加载布局的线程。\[3\]通过这些组件的协作,AsyncLayoutInflater实现了在后台线程中异步加载布局的功能。 #### 引用[.reference_title] - *1* [Android AsyncLayoutInflater 异步加载布局](https://blog.csdn.net/weixin_47592544/article/details/131192557)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [布局异步加载 - AsyncLayoutInflater](https://blog.csdn.net/hard_working1/article/details/106587401)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【Android笔记】异步加载View,AsyncLayoutInflater原理](https://blog.csdn.net/binzeefox/article/details/124168109)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值