日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Android性能优化(3)

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

Android性能優化(3)

布局優化

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

渲染

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

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

繪制流程(后來在網上找的,專門補充進來的):

附一個鏈接
Android App卡頓分析,以及使用Choreographer進行幀率統計監測感興趣的可以看下,互為補充 -_-

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

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

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

注意

注意

注意

上代碼

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

在清單文件里面為Activity設置主題,把上面的代碼加上就行了
其實做完這些,你會發現沒什么卵用,因為這不會對性能帶來明顯的改善。但還是建議這么做,性能優化東西,都是量變引起質變的

硬件加速

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

在引入硬件加速之前,view的屬性變化都需要重新繪制,硬件加速可以避免這個問題,因為發生變化的屬性并不是view本身,而是圖層中的那個對象。這些屬性變化不會影響視圖的層級結構

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

看著是不是很熟悉,沒錯,就是屬性動畫

提高動畫的性能,沒說的!!!
上代碼

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();

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

點9圖片

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

布局復用

  • include標簽

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

<?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標簽

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

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

    這個就比較厲害了,這東西可以作為一個節點,被添加到布局文件中,它關聯著一個布局文件,知道運行時,才會被繪制,

    <?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>

    上面布局所關聯的布局并不會被實例化,直到程序運行期間調用了這些方法

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

    或者

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

    一旦viewstub變為visible或者被加載,便不可以再用。以為他在布局層級中的位置被實例化出來的布局代替了。

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

    轉載于:https://www.cnblogs.com/sunjiandev/p/9407710.html

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。