日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android布局加载慢,Android布局优化(四)X2C — 提升布局加载速度200%

發(fā)布時(shí)間:2023/12/3 Android 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android布局加载慢,Android布局优化(四)X2C — 提升布局加载速度200% 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

系列文章

前言

在Android布局優(yōu)化(一)從布局加載原理說(shuō)起中我們說(shuō)到了布局加載的兩大性能瓶頸,通過(guò)IO操作將XML加載到內(nèi)存中并進(jìn)行解析和通過(guò)反射創(chuàng)建View。這里介紹一種避免運(yùn)行時(shí)通過(guò)IO操作讀取布局文件的“黑科技”—X2C。個(gè)人認(rèn)為這個(gè)技術(shù)在實(shí)際項(xiàng)目中使用可能會(huì)需要處理一些兼容性問(wèn)題,但是從技術(shù)人員的思維發(fā)散的角度,我認(rèn)為這其中的一些思想還是很值得學(xué)習(xí)和借鑒的

背景

一般大家在寫頁(yè)面時(shí)都是通過(guò)xml寫布局,通過(guò)setContentView、或LayoutInflater.from(context).inflate方法將xml布局加載到內(nèi)存中

優(yōu)點(diǎn)

可維護(hù)性好

支持即時(shí)預(yù)覽

代碼結(jié)構(gòu)清晰

缺點(diǎn)

讀取xml很耗時(shí)

遞歸解析xml較耗時(shí)

反射生成對(duì)象的耗時(shí)是new的3倍以上

我們團(tuán)隊(duì)在這個(gè)問(wèn)題上也探索過(guò)很多解決方案,一度走到了另一個(gè)極端,完全廢棄xml,所有控件通過(guò)java來(lái)new,甚至直接在canvas里繪制,這樣雖然性能確實(shí)提升了,但是代碼已經(jīng)沒有了一丁點(diǎn)可讀性,可維護(hù)性。 ?我們后來(lái)反思代碼到底是給機(jī)器看的,還是給人看的??也許X2C已經(jīng)給了我們一個(gè)答案

X2C

為了即保留xml的優(yōu)點(diǎn),又解決它帶來(lái)的性能問(wèn)題,我們開發(fā)了X2C方案。即在編譯生成APK期間,將需要翻譯的layout翻譯生成對(duì)應(yīng)的java文件,這樣對(duì)于開發(fā)人員來(lái)說(shuō)寫布局還是寫原來(lái)的xml,但對(duì)于程序來(lái)說(shuō),運(yùn)行時(shí)加載的是對(duì)應(yīng)的java文件。 ????我們采用APT(Annotation Processor Tool)+ JavaPoet技術(shù)來(lái)完成編譯期間【注解】->【解注解】->【翻譯xml】->【生成java】整個(gè)流程的操作。

性能對(duì)比

在開發(fā)集成完之后我們做了簡(jiǎn)單的測(cè)試,性能對(duì)比如下

加載方式

次數(shù)

平均加載時(shí)間

XML

100

30

X2C

100

11

集成使用

1.導(dǎo)入依賴

在module的build.gradle文件添加依賴

annotationProcessor 'com.zhangyue.we:x2c-apt:1.1.2'

implementation 'com.zhangyue.we:x2c-lib:1.0.6'

2.添加注解

在使用布局的任意java類或方法添加注解即可

@Xml(layouts = "activity_main")

3.配置自定義屬性(沒有可不配)

在module下建立X2C_CONFIG.xml文件,里面配置定義屬性和方法的映射關(guān)系,如果接收者是view,則寫view.否則填params.

4.通過(guò)X2C加載布局

在原先使用setContentView或inflate的地方替換,如下:

this.setContentView(R.layout.activity_main); --> X2C.setContentView(this, R.layout.activity_main);

LayoutInflater.from(this).inflate(R.layout.activity_main,null); --> X2C.inflate(this,R.layout.activity_main,null);

過(guò)程文件

原始的xml

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingLeft="10dp">

android:id="@+id/head"

layout="@layout/head"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true" />

android:id="@+id/ccc"

style="@style/bb"

android:layout_below="@id/head" />

生成的java文件

/**

* WARN!!! dont edit this file

* translate from {@link com.zhangyue.we.x2c.demo.R.layout.activity_main}

* autho chengwei

* email chengwei@zhangyue.com

*/

public class X2C_2131296281_Activity_Main implements IViewCreator {

@Override

public View createView(Context ctx, int layoutId) {

Resources res = ctx.getResources();

RelativeLayout relativeLayout0 = new RelativeLayout(ctx);

relativeLayout0.setPadding((int)(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,10,res.getDisplayMetrics())),0,0,0);

View view1 =(View) new X2C_2131296283_Head().createView(ctx,0);

RelativeLayout.LayoutParams layoutParam1 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);

view1.setLayoutParams(layoutParam1);

relativeLayout0.addView(view1);

view1.setId(R.id.head);

layoutParam1.addRule(RelativeLayout.CENTER_HORIZONTAL,RelativeLayout.TRUE);

ImageView imageView2 = new ImageView(ctx);

RelativeLayout.LayoutParams layoutParam2 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,(int)(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,1,res.getDisplayMetrics())));

imageView2.setLayoutParams(layoutParam2);

relativeLayout0.addView(imageView2);

imageView2.setId(R.id.ccc);

layoutParam2.addRule(RelativeLayout.BELOW,R.id.head);

return relativeLayout0;

}

}

生成的映射文件

/**

* WARN!!! don't edit this file

*

* author chengwei

* email chengwei@zhangyue.com

*/

public class X2C127_activity implements IViewCreator {

@Override

public View createView(Context context) {

View view = null ;

int sdk = Build.VERSION.SDK_INT;

int orientation = context.getResources().getConfiguration().orientation;

boolean isLandscape = orientation == Configuration.ORIENTATION_LANDSCAPE;

if (isLandscape) {

view = new com.zhangyue.we.x2c.layouts.land.X2C127_Activity().createView(context);

} else if (sdk >= 27) {

view = new com.zhangyue.we.x2c.layouts.v27.X2C127_Activity().createView(context);

} else if (sdk >= 21) {

view = new com.zhangyue.we.x2c.layouts.v21.X2C127_Activity().createView(context);

} else {

view = new com.zhangyue.we.x2c.layouts.X2C127_Activity().createView(context);

}

return view;

}

}

不支持

merge標(biāo)簽 ,在編譯期間無(wú)法確定xml的parent,所以無(wú)法支持

系統(tǒng)style,在編譯期間只能查到應(yīng)用的style列表,無(wú)法查詢系統(tǒng)style,所以只支持應(yīng)用內(nèi)style

支持

兼容ButterKnifer

兼容DataBinding

各種系統(tǒng)控件、自定義控件

include標(biāo)簽

viewStub標(biāo)簽

fragment標(biāo)簽

應(yīng)用style

自定義屬性

系統(tǒng)屬性

屬性名稱

屬性名稱

android:textSize

app:layout_constraintRight_toLeftOf

android:textColor

app:layout_constraintBottom_toTopOf

android:text

app:layout_constraintTop_toTopOf

android:background

app:layout_constrainedHeight

總結(jié)

以上是生活随笔為你收集整理的Android布局加载慢,Android布局优化(四)X2C — 提升布局加载速度200%的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。