2016-9-5

2016-9-5

1.Android內存溢出的幾種情況

Android中的內存溢出基本發生在以下三種情況:
    1.成員或全局靜態對象或單例對象對activity的強引用
    2.不在activity生命週期內的線程對activity的強引用
    3.activity中生命週期不可控的內部類或匿名類對activity的隱式引用
  在activity中引用着大量的view和其他資源,如果在ondestory()後沒能把activity回收,則會造成內存溢出
以下是幾種場景:
    1. activity內的靜態成員對象引用運行狀態的activity(如把activity以參數的形式傳給靜態成員對象,並且在此對象中對其持續引用), 靜態對象會在內存中一直保持加載狀態,這個對象持有了對activity的引用,就不會被GC回收, 如果在activity生命週期結束時沒有清除引用則會引起activity泄漏
    2. 在單例模式的類中不能持有activity的context,即不能把activity傳給單例類來構造對象
    2. activity中的view被實例成靜態的, 在activity中的view會持有對它的context的引用, 如果必須使用靜態view要確保activity完成前把View從視圖層級中分離出去
    3. 在activity中的內部類的靜態變量引用了activity的context, 這時可以使用WeakReference包裹,在使用時先判空再使用
    4. 匿名類持有包含它的類的引用, 如在activity中匿名地聲明並且實例化一個AsyncTask, 在activity銷燬後它仍在後臺工作的話, 對activity的引用會持續到後臺工作完成才進行GC
    5. 注意在activity中創建(非靜態)內部類或匿名類, 都會對包含它的類有隱式的應用,不要在activity中創建生命週期不可控的內部類或匿名類如(AsyncTask) 
    5. Handler的後臺任務, 定義的Runnable對象被Handler加入了執行隊列,Runnable會引用定義它的activity並持有到Handler的消息隊列中,只要在activity銷燬前消息還沒被處理,activity就會被保留在內存中,要注意在activity銷燬時從Hanlder移除Runnable對象
    6. Thread或TimerTask持有activity的引用, 在activity銷燬時注意移除
    7. 在單例類中持有activity的context
在activity中初始化對象時,要留心潛在的引用, 對activity的引用要是WeakReference, 並及時觀測程序運行時內存的釋放情況
在需要傳入Context的時候儘量考慮使用Application的Context,而不是Activity的
在Activity中儘量避免使用生命週期不受控制的非靜態類型的內部類(如匿名類),可以使用靜態類型的內部類加上弱引用的方式實現

2.HandlerThread使用

1.創建並啓動 mHandlerThread = new HandlerThread("HandlerThread");
    mhandlerThread.start();
2.使用HanlderThread中的Looper創建Hanlder
    Handler handler = new Handler(mHandlerThread.getLooper()){
            @Override
            public void handleMessage(Message msg) {// 非UI線程

            }
        };
3.在任意線程發送消息
4.onDestory()中退出 
    mHandlerThread.quit();
    或mHandlerThread.quitSafely();//是針對在消息隊列中還有消息或者是延遲發送的消息沒有處理的情況,調用這個方法後都會被停止掉
HandlerThread繼承Thread其內部維護了一個Looper,使用HandlerThread不用手動去調用Looper.prepare()和Looper.loop()等方法,Handler依賴Looper來維護髮出的消息,在一個線程中創建Handler必須爲其指定Looper,在UI線程Android已創建好了Looper,使用Context.getMainLooper();可以獲得

3.android5.0按鈕水波紋(ripple)效果使用

<?xml version="1.0" encoding="utf-8"?>  
<ripple xmlns:android="http://schemas.android.com/apk/res/android"  
    android:color="#FFEEEEEE">  

    <item android:id="@id/mask" android:drawable="@color/white" />  

</ripple> 
ripple相當於layer-list層疊效果,ripple元素的color屬性即指定了波紋效果的顏色,但必須是8位顏色代碼值,前兩位指定了波紋的透明度,後六位即波紋顏色,以黑色000000及白色FFFFFF效果最爲明顯
<item android:id="@id/mask" android:drawable="@color/white" />即指定了按鈕的正常狀態的顯示效果
必須在5.0以上有效果, 可以新建drawable-v21文件夾, 在drawable和drawable-v21放兩套同名的文件,drawable-v21爲5.0以上使用, drawable爲5.0以下使用
發佈了46 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章