简介
我们知道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