背景介绍
(1)布局文件读取慢:IO过程
(2)创建View慢:反射(比new慢3倍)
有以下两种方法可以优化布局加载,分别为:
方法1:异步AsyncLayoutInflater
简称:异步Inflate
工作流程:(1)在WorkThread加载布局,(原生使用的办法是在UI线程中加载布局),(2)加载结束后,回调主线程。
优点:节约主线程的时间。
使用 AsyncLayoutInflater 类实现步骤:
(1)这个类是谷歌提供的,但默认包中没有,需要导入一个包,
在app的 build.gradle 中添加。
implementation 'com.android.support:asynclayoutinflater:28.0.0'
(2)实现 AsyncLayoutInflater,如下:
// 在Activity中的onCreate()方法中,屏蔽下面语句
setContentView(R.layout.activity_main);
// 然后,添加如下代码
new AsyncLayoutInflater(MainActivity.this).inflate(R.layout.activity_main, null, new AsyncLayoutInflater.OnInflateFinishedListener() {
@Override
public void onInflateFinished(@NonNull View view, int i, @Nullable ViewGroup viewGroup) {
setContentView(view);
mRecyclerView = findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
mRecyclerView.setAdapter(mNewsAdapter);
mNewsAdapter.setOnFeedShowCallBack(MainActivity.this);
}
});
总结
(1)这个类是 final 的,不能被继承。如果想重写类中的方法,必须拷贝一份在此基础上实现。
(2)注意View中不能有依赖主线程的操作。
(3)这个方法只是缓解的作用,并没有从根本上解决(IO操作 和 反射)。
方法2:X2C方法
背景介绍:
鉴于以上的介绍,我们可以使用java代码来实现布局。
优点:本质上解决了性能问题,(不会IO操作,同时使用new创建)
缺点:引入新问题,不便于开发,可维护性差。(XML的优点是方便预览,维护性好)
X2C介绍:即保留了XML的优点,又解决了性能问题。
使用:开发人员写XML,手机系统加载界面的时候,加载的是java代码
原理:APT编译期翻译XML为Java代码
使用步骤:
(1)在app的build.gradle中添加两个库
annotationProcessor 'com.zhangyue.we:x2c-apt:1.1.2'
implementation 'com.zhangyue.we:x2c-lib:1.0.6'
(2)在加载的Activity中添加 @Xml 注解,如:
@Xml(layouts = "activity_main")
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main); 注释掉原来的。
// 添加这条语句
X2C.setContentView(MainActivity.this, R.layout.activity_main);
}
}
X2C问题
(1)部分属性Java不支持
(2)失去了系统的兼容(AppCompat)
(3)是开源的一个解决方案,如果要带到线上,需要修改代码,做充分的测试,