android sdk開發,ANR
全稱 (Application Not responding)
:指的是應用程序未響應,Android
系統對于事件的處理需要在一定時間內完成,如果超過該時間沒有得到響應,就會造成ANR。這時候會彈出一個彈窗來告訴用戶,當前應用程序未響應,是選擇等待還是Force Close
。
InputDispatching Timeout
:5秒內無法響應屏幕觸摸事件或鍵盤輸入事件BroadcastQueue Timeout
:在執行前臺廣播(BroadcastReceiver)
的onReceive()
函數時10秒沒有處理完成,后臺為60秒。Service Timeout
:前臺服務20秒內,后臺服務在200秒內沒有執行完畢。ContentProvider Timeout
:ContentProvider
的publish
在10s內沒進行完。避免在主線程中做耗時操作,可以通過以下方式: - 使用AsyncTask
處理耗時IO操作 - 使用Thread
或HandlerThread
提供優先級,可以調用 Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)
設置優先級,否則仍然會降低程序響應,因為默認Thread的優先級和主線程相同。 使用Handler
處理工作線程結果,而不是使用Thread.wait()
或者Thread.sleep()
來阻塞主線程。 - Activity
的onCreate
和onResume
回調中盡量避免耗時的代碼 - BroadcastReceiver
中onReceive
代碼也要盡量減少耗時,建議使用IntentService
處理。
Log
,因為logcat
清晰地記錄了ANR發生的時間,以及線程的tid。/data/anr/traces.txt
即可,最新的ANR信息在最開始部分。從stacktrace
中即可找到出問題的具體行數。需要注意的是,產生新的ANR,原來的traces.txt
文件會被覆蓋。OOM
指的是Out of Memory
(內存溢出),當前占用的內存加上我們申請的內存資源超過虛擬機所分配的最大內存限制,并且虛擬機沒有足夠的內存來為對象分配空間,此時垃圾回收器也已經沒有空間可回收時,就會拋出這個error
(注:是error
,因為這個問題已經嚴重到不足以被應用處理)。
Acitivity
沒有對棧進行管理,如果開啟過多,就容易造成內存溢出Handler
造成內存泄露listView
等getView
方法沒有復用減少新分配的對象占用內存的大小,使用更加輕量級的對象,這是首要做的事 1. 使用更加輕量級的數據結構,比如ArrayMap
或者SparseMap
而不是HashMap
等傳統數據結構 2. 避免在Android
中使用Enum
枚舉 3. 減少Bitmap
對象的內存占用,由于Bitmap
非常容易占用大量內存,所以必須減少它的內存占用非常重要,可以通過以下方式: - inSampleSize
:縮放比例,首先計算出一個合適的縮放比例,再把圖片載入到內存中,避免大圖的載入過多的占用內存 - decode format
:解碼格式,不同的解碼格式差異非常大,所以得從選擇ARGB_8888/RBG_565/ARGB_4444/ALPHA_8
選擇合適的格式 4. 使用更小的圖片
ListView
與GridView
重要ConvertView
,并且在ListView
與GridView
等顯示大量圖片控件里,需要使用LRU
機制來緩存處理好Bitmap
OnDraw
方法里執行對象的創建,由于onDraw
方法會被頻繁調用,如果在這里面進行對象創建,會迅速增加內存,頻繁GC
,并且會產生內存抖動StingBuilder
來替代頻繁的"+"操作內存泄漏也是造成OOM的一個重要因素。當對象泄漏時,會占用內存大小,并導致后面對象的內存分配不足,造成OOM。 - 避免內部類引用Activity
導致的內存泄漏 - Bitmap
對象要及時回收 - 一些資源不使用要及時關閉,比如:BroadcastReceiver,ContentObserver,FileObserver,Cursor,Callback,EventBus
等在Activity onDestroy
或者某類生命周期結束之后一定要 unregister
或者close
掉,否則這個 Activity 類會被系統強引用,不會被內存回收。值得注意的是,關閉的語句必須在finally
中進行關閉,否則有可能因為異常未關閉資源,致使Activity泄漏。 - 要注銷監聽器
static
要注意,因為static
生命周期與Application
一樣長,使用不當會造成內存泄漏ProGuard
來移除無用代碼版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态