安卓初始化页面时view的异步加载

本文介绍了如何在安卓应用中优化页面初始化,通过使用RxJava2进行异步加载耗时的view,以提高用户体验。首先,通过Debug工具检测耗时,然后将复杂的视图加载移到AsyncLoadView函数中,用临时纯色view占位,待异步加载完成后替换。此外,添加Callback机制以便在主线程订阅成功事件后执行后续操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安卓初始化页面时view的异步加载

前提条件

  • Rxjava 2
    -导入io.reactivex.rxjava2:rxjava:${Version.rxjava2}

  • 在初始化页面时 inflate耗时较久的view

使用

1. 可以先用as的 *

Debug.startMethodTracing

Debug.stopMethodTracing

去检测中间代码的耗时时间;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        Debug.startMethodTracing("SearchMusicActivity");
        setContentView(R.layout.activity_search_music);
        initView();
        AsyncLoadView();
//        Debug.stopMethodTracing();
    }

initView()中复杂页面的加载放到 AsyncLoadView() 中 , initView()可只放整体框架界面,便于快速进入此页面(活动或碎片等);

 @SuppressLint("CheckResult")
    private void AsyncLoadView() {
        Single.create((SingleOnSubscribe<View>) emitter -> {
            View view = getLayoutInflater().inflate(R.layout.search_left, null);
            // 解析xml的操作
            emitter.onSuccess(view);
        }).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(view -> {
                    View stub = findViewById(R.id.viewStub);
                    if (stub == null) return;
                    ViewGroup parent = (ViewGroup) stub.getParent();
                    // 先找到占位的View
                    int index = parent.indexOfChild(stub);
                    // 拿到属性
                    ViewGroup.LayoutParams vlp = stub.getLayoutParams();
                    // 把属性设置给新的View
                    view.setLayoutParams(vlp);
                    // 从view 树中删除
                    parent.removeViewAt(index);
                    // 把新的View加载进去
                    parent.addView(view, index);
                    initKeyBoard();
                });
    }

因为原来R.layout.search_left 处的布局被异步加载了,所以原来的位置用一块纯色view填充,等异步加载成功之后替换掉,并把宽高等LayoutParams属性赋给复杂view

可以给AsyncLoadView()加一个CallBack参数,便于在emitter.onSuccess(view)发送成功事件 之后,主线程订阅到相应事件时调用回调成功, 做一些其他操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值