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

歡迎訪問 生活随笔!

生活随笔

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

Android

Android性能优化(3)

發(fā)布時(shí)間:2025/4/16 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android性能优化(3) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Android性能優(yōu)化(3)

布局優(yōu)化

在Android 開發(fā)過程中,其實(shí)有很大一部分工作量是在寫布局上,布局寫的好不好,直接影響用戶的直觀感受。如何做一個(gè)運(yùn)行流暢,可靠,ui美觀高效的app,狠重要

渲染

有個(gè)幀的概念先說一下,在數(shù)字世界,有由一定的幀來模擬真實(shí)事物的,有這么一個(gè)規(guī)律:在單位時(shí)間內(nèi),越多的幀被處理,我們看到的事物就越真實(shí)。10-20/幀/s是大腦感受最小的幀數(shù),低于這個(gè)就真的成ptt了。

應(yīng)用程序的運(yùn)行過程中幀速率是最理想是60s(不清楚這個(gè)數(shù)據(jù)的出處,書上看到的)也就是說一幀刷新要在1/60s內(nèi)完成,差不多是16ms的樣子,what ???,當(dāng)然這個(gè)再理論值,理想很豐滿,現(xiàn)實(shí)很骨感,,,,

繪制流程(后來在網(wǎng)上找的,專門補(bǔ)充進(jìn)來的):

附一個(gè)鏈接
Android App卡頓分析,以及使用Choreographer進(jìn)行幀率統(tǒng)計(jì)監(jiān)測感興趣的可以看下,互為補(bǔ)充 -_-

一般是做不到的,比如說視圖層級嵌套太多導(dǎo)致被重繪的次數(shù)太多,占用cpu的太多資源(為什么是cpu,不是都gup了嗎???后面會(huì)說),如果和出現(xiàn)這種情況,這一幀被丟棄,ui界面不會(huì)更新,在下一幀被繪制之前,還是顯示之前的圖像。我們要做的就是避免此類情況的發(fā)生

上圖,展示一下在**setContentView(int layoutId)的加載過程

頂層的DecorView,在主題為Activity設(shè)置背景,就是通過這玩意來顯示的額,其實(shí)這個(gè)是多余的,這個(gè)默認(rèn)的背景會(huì)被設(shè)置的布局文件所覆蓋,我們要做的就是不讓系統(tǒng)做這些無用功

注意

注意

注意

上代碼

<resource><style name = "Theme.NoBackground" parent = "android.Theme"><item name = "android:windowBackground">@null</item></style> </resource>

在清單文件里面為Activity設(shè)置主題,把上面的代碼加上就行了
其實(shí)做完這些,你會(huì)發(fā)現(xiàn)沒什么卵用,因?yàn)檫@不會(huì)對性能帶來明顯的改善。但還是建議這么做,性能優(yōu)化東西,都是量變引起質(zhì)變的

硬件加速

之前為什么說cup不說gpu了,在Android的版本演進(jìn)過程中引入了硬件加速,分擔(dān)一部分cpu的工作,所有視圖的渲染以及canvas的繪制,都有g(shù)pu來完成,這個(gè)是在Android 3.0后引入的
其實(shí)現(xiàn)在說這個(gè)好像是在說廢話,最開始這是一個(gè)可選擇項(xiàng),在清單文件里面可以開機(jī)硬件加速,但是在Android 4.0之后就默認(rèn)開啟了,不要你操心了。

在引入硬件加速之前,view的屬性變化都需要重新繪制,硬件加速可以避免這個(gè)問題,因?yàn)榘l(fā)生變化的屬性并不是view本身,而是圖層中的那個(gè)對象。這些屬性變化不會(huì)影響視圖的層級結(jié)構(gòu)

  • aloha
  • x
  • y
  • translationX
  • translationY
  • scaleX
  • scaleY
  • rotationX
  • rotationY
  • pivotX
  • pivotY

看著是不是很熟悉,沒錯(cuò),就是屬性動(dòng)畫

提高動(dòng)畫的性能,沒說的!!!
上代碼

view.setLayerType(View.LAYER_TYPE_HARDWARE,null);ObjectAnimator animator = ObjectAnimator.ofFloat(view,"rotationY",180);animator.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {super.onAnimationEnd(animation);view.setLayerType(View.LAYER_TYPE_NONE,null);}});animator.start();

注意:這個(gè)是在Android 6.0之前要干的事,之后就不用了,自適應(yīng)硬件。這個(gè)是要適配低版本的要做的事

點(diǎn)9圖片

在Android中,管理位圖個(gè)管理點(diǎn)9圖片的方式是不一樣的,系統(tǒng)針對點(diǎn)9圖片進(jìn)行了特殊優(yōu)化,在點(diǎn)9圖片中,被其他視圖所遮蓋的部分,會(huì)被android 渲染成透明的,而透明的像素部分不會(huì)被系統(tǒng)渲染,背景圖片使用點(diǎn)9圖,可以在一定程度上減少過度繪制

布局復(fù)用

  • include標(biāo)簽

這個(gè)標(biāo)簽其實(shí)對于開發(fā)者來說減少的只不過是Ctrl+C和Ctrl+V的次數(shù)而已,對于性能而言并沒有多大幫助,依然是有層級的嵌套

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/chat_base_color"android:orientation="vertical"><include layout="@layout/account_infor_item"/><RelativeLayoutandroid:id="@+id/title_layout"android:layout_width="match_parent"android:layout_height="@dimen/d55"android:background="@color/base_color"android:orientation="horizontal"><ImageViewandroid:id="@+id/back"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_gravity="center_vertical"android:layout_marginLeft="@dimen/d10"android:padding="@dimen/d5"android:src="@mipmap/back" /><TextViewandroid:id="@+id/tv_chat_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_gravity="center"android:layout_marginLeft="@dimen/d10"android:layout_toRightOf="@id/back"android:gravity="center"android:text="@string/name"android:textColor="@color/white"android:textSize="@dimen/d20" /><ImageViewandroid:id="@+id/tv_chat_edit"android:layout_width="@dimen/d40"android:layout_height="@dimen/d40"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="@dimen/d10"android:scaleType="fitXY"android:src="@mipmap/group_icon"android:visibility="gone" /></RelativeLayout> </LinearLayout>

就是這樣。。。。

  • merge標(biāo)簽

但是這個(gè)就不一樣了,這玩意可以減少布局的允于,整體層級更加扁平,只要將復(fù)用布局文件的跟布局換成merge標(biāo)簽就可以了,在加載的時(shí)候會(huì)忽略掉這個(gè)標(biāo)簽,但是,,,,但是,,,,,但是,使用這個(gè)標(biāo)簽的時(shí)候又兩個(gè)限制

  • 只能作為布局文件的根布局來使用
  • 在調(diào)用LayoutInflater.inflate()時(shí),必須為merge布局文件提供一個(gè)view,作為他的父容器
    LayoutInflater.from(context).inflate(R.layout.merge_layout,parent,true)
    • viewstub標(biāo)簽

    這個(gè)就比較厲害了,這東西可以作為一個(gè)節(jié)點(diǎn),被添加到布局文件中,它關(guān)聯(lián)著一個(gè)布局文件,知道運(yùn)行時(shí),才會(huì)被繪制,

    <?xml version="1.0" encoding="utf-8"?> <ViewStub xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"android:layout="@layout/activity_main"> </ViewStub>

    上面布局所關(guān)聯(lián)的布局并不會(huì)被實(shí)例化,直到程序運(yùn)行期間調(diào)用了這些方法

    • findviewbyid(R.id.viewstub).setVisibility(View.VISIBLE)

    或者

    • findviewbyid(R.id.viewstub).inflate()

    一旦viewstub變?yōu)関isible或者被加載,便不可以再用。以為他在布局層級中的位置被實(shí)例化出來的布局代替了。

    這貨很有用,在面對比較復(fù)雜的布局層級是,我們可以使用ViewStub延遲部分view的加載,縮短首次加載的時(shí)間,減少一些不必要的內(nèi)存分配。
    好了,這篇就到這了,下篇接著再寫。。。。。

    轉(zhuǎn)載于:https://www.cnblogs.com/sunjiandev/p/9407710.html

    總結(jié)

    以上是生活随笔為你收集整理的Android性能优化(3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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