最近在做的项目页面复杂导致布局嵌套多层,而且又使用了百分比布局(可能主要是这个原因)导致页面加载的时候主线程会被阻塞,

那要想减少主线程阻塞,一来就是简化布局,减轻LayoutInflater的负担,二来就是异步加载布局。

项目当中用了rxjava,于是直接写个异步加载的工具类

public class InflaterUtil {

    public static void ansycInflate(final Context context, final int resource, @Nullable final ViewGroup root, final boolean attachToRoot, final AsyncInflate asyncInflate) {
Observable
.create(new ObservableOnSubscribe<View>() {
@Override
public void subscribe(ObservableEmitter<View> emitter) throws Exception {
View view = LayoutInflater.from(context).inflate(resource, root, attachToRoot);
emitter.onNext(view);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new Observer<View>() {
@Override
public void onSubscribe(Disposable d) { } @Override
public void onNext(View view) {
if (asyncInflate != null) asyncInflate.success(view);
} @Override
public void onError(Throwable e) {
MLog.e(e.toString());
} @Override
public void onComplete() {
}
});
} }

在子线程加载布局为View对象,然后在主线程把view返回,来更新UI。

需要注意,在有些机型上,异步加载布局会在主线程的looper创建完成之前调用,所以依赖与handler和looper的view,

会出现异常,比如SurfaceView,TextClock等等。

对于这些view,可以这样处理,先使用ViewStub占位,等view异步加载完成后,再调用ViewStub的inflate方法来初始化。

布局文件占位

<ViewStub
android:id="@+id/stub_slogan"
android:layout="@layout/layout_slogan"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

java代码动态初始化

InflaterUtil.ansycInflate(getContext(), R.layout.layout_top_left, leftContainer, true, new InflaterUtil.AsyncInflate() {
@Override
public void success(View view) {
final ViewStub stub_slogan = view.findViewById(R.id.stub_slogan);
stub_slogan.setOnInflateListener(new ViewStub.OnInflateListener() {
@Override
public void onInflate(ViewStub stub, View inflated) {
// scrollTextView = view.findViewById(R.id.scrollText);
sloganTextView = view.findViewById(R.id.tv_slogan);
}
});
}
});

这样就可以了

最新文章

  1. Redis设计与实现读书笔记(二) 链表
  2. MVVM架构~knockoutjs系列之从Knockout.Validation.js源码中学习它的用法
  3. Mybatis中SqlMapper配置的扩展与应用(1)
  4. pptp建立vpn
  5. iptables规则表
  6. svn迁移
  7. Java中的编码问题
  8. php 编译安装选项
  9. 让Safari使用Chrome的代理
  10. PHP程序效率优化
  11. mysql 查看表的类型(转)
  12. DedeCMS实现自定义表单提交后发送指定QQ邮箱法
  13. 【.NET异步编程系列1】:await&amp;async语法糖让异步编程如鱼得水
  14. windows下apache+https环境配置
  15. js中检测数据类型的几种方式
  16. Zephyr学习(一)Zephyr介绍
  17. c++的矩阵乘法加速trick
  18. 详细介绍svn在eclipse中的使用(附图解说明)
  19. Swif基础语法01
  20. Antenna Placement---poj3020(最大匹配)

热门文章

  1. Django学习笔记之模板
  2. dos2unix 批量转化文件
  3. Sublime远程连接Linux
  4. CMake for MFC example
  5. dubbo 熔断,限流,降级
  6. json 数据在textarea中显示的时候,切换 beauty和ugly模式
  7. LeetCode【83. 删除排序链表中的重复元素】
  8. uva-10670-贪心
  9. issue_hana
  10. html: 仿制soundmanager2右上角面板