亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android中“后臺無效動畫“行為的示例分析

發布時間:2021-11-26 14:39:28 來源:億速云 閱讀:133 作者:柒染 欄目:移動開發

這期內容當中小編將會給大家帶來有關Android中“后臺無效動畫“行為的示例分析,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

當一個 Android App 退到后臺之后,只要他沒有被殺死,那么他做什么事情大家都不要奇怪,因為這就是 Android。但是當用戶知道一個你一個  App  退到后臺之后還在持續做無效的動畫,而這個動畫完全是無意義的,而且用戶還不知道他在做動畫,消耗用戶那可憐的電量的時候,輕則被多任務殺掉,禁止后臺運行,重則直接卸載。

一般的開發者很難發現這個問題,但是如果你經常使用 Systrace ,多開幾十個應用然后退回到桌面,左右滑動抓取 Systrace  ,就可以很容易發現,總有那么幾個后臺的應用,還在頻繁地做無效的動畫。

這里說的后臺做動畫,指的是由于某種原因,應用在退到后臺之后,用戶看不到任何這個 App 界面的時候,他仍然在后臺不斷地更新,耗費  CPU。引起這個問題的原因可能有好多個,畢竟 往 Choreographer 扔 CALLBACK_ANIMATION  的地方太多了,而且每個應用可能都不一樣,但最終還是需要各個應用去做修復

下面我們就以兩個實例,從技術的角度來看一下事件發生時候的情況和原因,希望看到這篇文章的開發者,檢查一下自己的應用是否有這個問題,有則改之,無則恭喜

實例 - 網易新聞

我們在使用網易新聞后,將網易新聞退到后臺,然后左右滑動桌面,抓 Systrace 來看:

網易新聞到后臺之后還在持續做 Animation 的回調(紅框內),每一幀都還是在 doFrame 操作

Android中“后臺無效動畫“行為的示例分析

放大每一個 doFrame 來看,Choreographer 中的 input 和 traversal 都沒有觸發,只有 animation  的回調一直在執行

Android中“后臺無效動畫“行為的示例分析

我們把這份 Trace 上的 cpu 部分全選,然后下面按照 Wall Duration  排序,可以發現網易新聞后臺動畫執行時間最長。應用已經在后臺且不可見的時候,還在這么頻繁地工作,占用 CPU 資源,消耗電量,實在是不應該

Android中“后臺無效動畫“行為的示例分析

抓對應的 MethodTrace 來看,就是在做動畫,沒有進行關閉 ,動畫依舊在每一幀進行 onAnimationUpdate 的回調  ,可以看到這里是因為使用了 Airbnb 的 Lottie 庫導致的,動畫沒有關閉,所以還是一直在做觸發

Android中“后臺無效動畫“行為的示例分析

實例 - QQ音樂

啟動 QQ 音樂,然后回到桌面, 左右滑動桌面并抓取 Systrace 和 MethodTrace ,可以看到跟上面的網易新聞的表現一致

Android中“后臺無效動畫“行為的示例分析

抓取了 QQ 音樂的后臺動畫時候的 MethodTrace 發現,也是由于退到后臺之后,沒有暫停動畫導致的,也是 Airbnb 的 Lottie 的鍋,  而且 QQ 音樂有三個動畫沒有停止,比網易新聞還要嚴重一些

Android中“后臺無效動畫“行為的示例分析

放大后可以看到

Android中“后臺無效動畫“行為的示例分析

當然也不是每一個都是 Airbnb 的 Lottie 動畫庫引起的,比如下面這個,就是普通的動畫沒有結束

Android中“后臺無效動畫“行為的示例分析

根本原因

根本原因是應用在不可見之后,沒有將動畫暫停,導致應用切換到后臺之后,依然在刷新動畫的回調,但此時由于是不可見的,不會觸發 Input Callback 和  draw Callback ,所以也不會有任何的繪制操作,也就是說這個 Animation 的刷新完全是沒有意義的(當然也有可能是業務需求?)

上面兩個例子里面,網易新聞和 QQ 音樂都是因為使用了 Lottie 來實現動畫,但是沒有正確的關閉導致的。

開發建議

Lottie 庫的 issue 列表里面有人提到了這個情況:

提出問題:

  • I recently did some benchmarking on an app which uses lottie to do some  animations (autoplay and looping). I noticed that there is quite some CPU usage  when the app is in the background and tried to investigate.

  • It seems to me looping animations do not pause/stop when the containing  LottieAnimationView is off screen, and/or the Activity is paused.

  • I believe this is due to the cleanup code being only in  onDetachedFromWindow() which is not necessarily being called once the Activity  goes into a paused state and most definitely not, when the view is simply not  visible (GONE, INVISIBLE ) anymore.

解決方法:

  • Overriding LottieAnimationView and doing the following solves the visibility  issue for me and Lottie is paused when not visible.

@Override protected void onVisibilityChanged(@NonNull View changedView, int visibility) {     super.onVisibilityChanged(changedView, visibility);     if (visibility == VISIBLE && wasAnimatingWhenVisibilityChanged) {         resumeAnimation();     } else {         if (isAnimating()) {             wasAnimatingWhenVisibilityChanged = true;             pauseAnimation();         } else {             wasAnimatingWhenVisibilityChanged = false;         }     } }

總之就是 : 當 App 不可見的時候,停止所有的動畫:pauseAnimation!!!

上述就是小編為大家分享的Android中“后臺無效動畫“行為的示例分析了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿克| 竹北市| 巴彦县| 江川县| 恩施市| 五台县| 喀什市| 神农架林区| 霍林郭勒市| 土默特右旗| 军事| 太和县| 镇安县| 阿拉善左旗| 波密县| 柘荣县| 蒙阴县| 兴宁市| 宁乡县| 泸溪县| 惠安县| 婺源县| 邯郸县| 广西| 永清县| 石柱| 江门市| 奉新县| 平利县| 汝城县| 土默特左旗| 萍乡市| 寻甸| 万年县| 安丘市| 耒阳市| 晋城| 德保县| 兴海县| 兴业县| 罗源县|