【Android】异步加载布局探索
最近在做的项目页面复杂导致布局嵌套多层,而且又使用了百分比布局(可能主要是这个原因)导致页面加载的时候主线程会被阻塞,
那要想减少主线程阻塞,一来就是简化布局,减轻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);
}
});
}
});
这样就可以了
【Android】异步加载布局探索的更多相关文章
- 演化理解 Android 异步加载图片
原文:http://www.cnblogs.com/ghj1976/archive/2011/05/06/2038738.html#3018499 在学习"Android异步加载图像小结&q ...
- [转载]Android 异步加载解决方案
2013-12-25 11:15:47 Android 异步加载解决方案,转载自: http://www.open-open.com/lib/view/open1345017746897.html 请 ...
- 演化理解 Android 异步加载图片(转)
演化理解 Android 异步加载图片(转)http://www.cnblogs.com/CJzhang/archive/2011/10/20/2218474.html
- 实例演示Android异步加载图片
本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...
- 实例演示Android异步加载图片(转)
本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...
- Android异步加载
一.为什么要使用异步加载? 1.Android是单线程模型 2.耗时操作阻碍UI线程 二.异步加载最常用的两种方式 1.多线程.线程池 2.AsyncTask 三.实现ListView图文混排 3-1 ...
- Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅
Android 高手进阶(21) 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明出处http://blog.csdn.net/xiaanming/article/details ...
- android 异步加载框架 原理完全解析
一.手写异步加载框架MyAsycnTask(核心原理) 1.我为大家手写了一个异步加载框架,涵盖了异步加载框架核心原理. MyAsycnTask.java import android.os.Hand ...
- [Android]异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3574131.html 这个可以实现ImageView异步加载 ...
随机推荐
- Centos7安装mysql5.6.29shell脚本
创建脚本mysql.sh,直接运行sh mysql.sh #!/bin/bash if [ -d /software ] ;then cd /software else mkdir /software ...
- linux上安装memcached步骤
libevent: http://libevent.org/ 服务器端:https://code.google.com/archive/p/memcached/downloads 客户端: http: ...
- localStorage小结
使用HTML5可以在本地存储用户的浏览数据.. 什么是 HTML5 Web 存储? 在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie ...
- uCOS-III等RTOS与IoT OS
一.IoT 以百度天工物联网为例,如下图所示: 通过联网设备,将设备连接至云端,并将每个设备的信息进行上传,并在云端进行设备的管理,设备数据的处理计算.存储,可视化的展示和分析.IoT设备较传统的嵌入 ...
- LDAP认证模式简介
今天发现公共服务中有ldap数据库服务,先大概了解一下ldap,转载下面的文章.原文链接:https://www.jianshu.com/p/d3f8c8f5d661 另外记录一篇文章地址:https ...
- JVM学习总结(一):Java内存区域
一.JVM运行时数据区 1.程序计数器: (1)一块较小的线程私有的内存空间. (2)JVM的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(或一个内核) ...
- JVM-字节码
- window.open() 打开的子页面 往主页面传参问题
<!--主页面的代码--><!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- jdbc与TiDB数据库交互的过程
以下是使用jdbc操作TiDB数据库,得到的交互过程和指令的说明 ==>代表发送给数据库的指令 // 加载驱动程序Class.forName(driver); // 连接数据库 Connecti ...
- PHP获取手机型号
<?php $user_agent = $_SERVER['HTTP_USER_AGENT']; if (stripos($user_agent, "iPhone") ...