android sdk開發,android開啟前臺服務_Android 知識點必知之ANR與OOM

 2023-12-06 阅读 23 评论 0

摘要:ANRANR 簡介android sdk開發,ANR 全稱 (Application Not responding):指的是應用程序未響應,Android 系統對于事件的處理需要在一定時間內完成,如果超過該時間沒有得到響應,就會造成ANR。這時候會彈出一個彈窗來告訴用戶,當前應用程序未響

9a2b15b46334240076f4a368668dd4d7.png

ANR

ANR 簡介

android sdk開發,ANR 全稱 (Application Not responding):指的是應用程序未響應,Android 系統對于事件的處理需要在一定時間內完成,如果超過該時間沒有得到響應,就會造成ANR。這時候會彈出一個彈窗來告訴用戶,當前應用程序未響應,是選擇等待還是Force Close

ANR 場景

  • InputDispatching Timeout:5秒內無法響應屏幕觸摸事件或鍵盤輸入事件
  • BroadcastQueue Timeout :在執行前臺廣播(BroadcastReceiver)onReceive()函數時10秒沒有處理完成,后臺為60秒。
  • Service Timeout :前臺服務20秒內,后臺服務在200秒內沒有執行完畢。
  • ContentProvider TimeoutContentProviderpublish在10s內沒進行完。

解決 ANR

避免在主線程中做耗時操作,可以通過以下方式: - 使用AsyncTask處理耗時IO操作 - 使用ThreadHandlerThread提供優先級,可以調用 Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)設置優先級,否則仍然會降低程序響應,因為默認Thread的優先級和主線程相同。 使用Handler處理工作線程結果,而不是使用Thread.wait()或者Thread.sleep()來阻塞主線程。 - ActivityonCreateonResume回調中盡量避免耗時的代碼 - BroadcastReceiveronReceive代碼也要盡量減少耗時,建議使用IntentService處理。

ANR 分析

  1. 查看Log,因為logcat清晰地記錄了ANR發生的時間,以及線程的tid。
  2. 通過查看/data/anr/traces.txt即可,最新的ANR信息在最開始部分。從stacktrace中即可找到出問題的具體行數。需要注意的是,產生新的ANR,原來的traces.txt 文件會被覆蓋。
  3. 使用DDMS——Update Threads工具,通過閱讀Update Threads的輸出結果來查找。

推薦任玉剛寫的開發藝術探索,對個人進階成高級工程師很有幫助

OOM

OOM 簡介

OOM指的是Out of Memory(內存溢出),當前占用的內存加上我們申請的內存資源超過虛擬機所分配的最大內存限制,并且虛擬機沒有足夠的內存來為對象分配空間,此時垃圾回收器也已經沒有空間可回收時,就會拋出這個error(注:是error,因為這個問題已經嚴重到不足以被應用處理)。

其他相關概念

  • 內存泄漏:指程序分配出去的內存不再使用,無法進行回收
  • 內存抖動:指程序短時間內大量創建對象,然后回收的現象

OOM 場景

  • Acitivity沒有對棧進行管理,如果開啟過多,就容易造成內存溢出
  • 加載大的圖片或者同時數量過多的圖片的時候
  • 數據庫或者資源沒有關閉
  • 靜態成員變量持有類的應用
  • 非靜態內部類持有外部類的引用,使用非靜態內部類創建靜態變量
  • 單例引起內存泄露
  • Handler造成內存泄露
  • 線程周期不可控
  • 無線循環的屬性動畫引起內存泄露
  • listViewgetView方法沒有復用
  • 遞歸次數過多,也會導致內存溢出
  • 頻繁的內存抖動,也會造成OOM異常的發生,大量小的對象被平凡的創建,導致內存碎片,從而當需要分配內存的時候,雖然總體上還有內存分配,但是由于這些內存不是連續的,導致無法分配,系統就直接返回OOM了

OOM 避免

減小對象的內存占用

減少新分配的對象占用內存的大小,使用更加輕量級的對象,這是首要做的事 1. 使用更加輕量級的數據結構,比如ArrayMap或者SparseMap而不是HashMap等傳統數據結構 2. 避免在Android中使用Enum枚舉 3. 減少Bitmap對象的內存占用,由于Bitmap非常容易占用大量內存,所以必須減少它的內存占用非常重要,可以通過以下方式: - inSampleSize:縮放比例,首先計算出一個合適的縮放比例,再把圖片載入到內存中,避免大圖的載入過多的占用內存 - decode format:解碼格式,不同的解碼格式差異非常大,所以得從選擇ARGB_8888/RBG_565/ARGB_4444/ALPHA_8選擇合適的格式 4. 使用更小的圖片

內存對象的復用

  1. 復用系統自帶的資源
  2. ListViewGridView重要ConvertView,并且在ListViewGridView等顯示大量圖片控件里,需要使用LRU機制來緩存處理好Bitmap
  3. 避免在OnDraw方法里執行對象的創建,由于onDraw方法會被頻繁調用,如果在這里面進行對象創建,會迅速增加內存,頻繁GC,并且會產生內存抖動
  4. 如果代碼中使用到大量的字符串拼接操作,使用StingBuilder來替代頻繁的"+"操作

避免內存泄漏

內存泄漏也是造成OOM的一個重要因素。當對象泄漏時,會占用內存大小,并導致后面對象的內存分配不足,造成OOM。 - 避免內部類引用Activity導致的內存泄漏 - Bitmap對象要及時回收 - 一些資源不使用要及時關閉,比如:BroadcastReceiver,ContentObserver,FileObserver,Cursor,Callback,EventBus等在Activity onDestroy或者某類生命周期結束之后一定要 unregister 或者close 掉,否則這個 Activity 類會被系統強引用,不會被內存回收。值得注意的是,關閉的語句必須在finally中進行關閉,否則有可能因為異常未關閉資源,致使Activity泄漏。 - 要注銷監聽器

其他一些方式

  • 使用static要注意,因為static生命周期與Application一樣長,使用不當會造成內存泄漏
  • 謹慎使用多進程,因為多進程會將應用的部分組件運行在單獨的進程中,擴大了內存占用,增加了內存大小,使用不當會造成OOM
  • 優化布局層次,減少內存消耗
  • 使用ProGuard來移除無用代碼
  • 謹慎使用第三方庫

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/188632.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息