android hander如何避免記憶體泄露,androidhander

來源:互聯網
上載者:User

android hander如何避免記憶體泄露,androidhander

在使用Android Handler的時候,可能會遇到編譯器給我們這樣的警告:

 

This Handler class should be static or leaks might occur

 

造成這個警告的原因是handler持有外層類(Activity等)的引用,同時訊息佇列中的Message對handler也持有引用,這樣就造成一些資源不能回,從而可能造成記憶體泄露。

 

解決這個警告的辦法即讓handler不持有外部類的引用,怎麼做到這一點呢,即將Handler設定為靜態內部類就行了,將外部類(Activity等)傳遞給Handler,在Handler中建立弱引用(WeakReference).

 

為了能夠使以後更好的使用Handler-Message機制,我這裡對其進行了封裝,使用方法見下。先看一下代碼。

 

CBHandler.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package me.codeboy.android.common.component;

import android.os.Handler;
import android.os.Message;

import java.lang.ref.WeakReference;

import me.codeboy.android.common.app.CBActivity;

/**
 * Created by yuedong.lyd on 6/7/15.
 * <p>
 *    構建防止記憶體泄露的handler
 * </p>
 */
public class CBHandler {
    /**
     * 防止handler對activity有隱式引用,匿名內部類不會對外部類有引用
     */
   public static class UnleakHandler extends Handler {
        private final WeakReference<CBActivity> activity;

        public UnleakHandler(CBActivity activity) {
            this.activity =  new WeakReference<CBActivity>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(activity.get() == null) {
                return;
            }
            activity.get().processMessage(msg);
        }
    }
}

 

CBActivity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package me.codeboy.android.common.app;

import android.app.Activity;
import android.os.Bundle;
import android.os.Message;

import me.codeboy.android.common.component.CBHandler;

/**
 * Created by yuedong.lyd on 6/8/15.
 */
public abstract  class CBActivity extends Activity{
    public CBHandler.UnleakHandler handler ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        handler = new CBHandler.UnleakHandler(this);
    }

    /**
     * 處理訊息
     * @param msg
     */
    public abstract void processMessage(Message msg);
}

 

在使用中,我們只需自己的Activity繼承CBActivity即可,在onCreate時自動建立UnleakHandler的執行個體handler,從CBHandler的代碼中我們也可以看出來,UnleakHandler自動將收到的訊息交給CBActivity中的processMessage進行處理。我們只需要在發送訊息的時候使用handler變數發送即可,處理在processHandler中處理即可。


更多文章請訪問小胖軒.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.