【小王的安卓之路】Handler防治內存泄漏的優化使用方法

Handler防治內存泄漏的優化使用方法

.

一.爲什麼進行優化:

在使用handler時,有時候我們會傳遞參數,這些參數可能是對某個已經銷燬的Activity的引用。從而導致系統不能GC掉這個Activity導致資源浪費。其根本原因是靜態內部類持有了外部類的引用,導致外部activity無法被回收。

.
.

二.怎麼優化:

1.將handler設置爲靜態
2.傳遞參數時傳遞弱引用而不是強引用
3.在創建handler的activity中的onDestory回調方法裏,加入handler的釋放方法:handler.removeCallBack()
案例:
倒計時程序
佈局文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

java文件:

package com.example.handlerest;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

import java.lang.ref.WeakReference;

public class MainActivity extends AppCompatActivity {

    public static final int COUNTDOWN = 1001;
    public static final int MAX_NUMBER = 10;
    public static final int DELAY_MILLIS = 1000;
    private  TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         textView= findViewById(R.id.text1);
         CountDownHandler handler = new CountDownHandler(this);



        Message message = Message.obtain();
        message.what = COUNTDOWN;
        message.arg1 = MAX_NUMBER;
        handler.sendMessageDelayed(message,DELAY_MILLIS);

    }

    public static class  CountDownHandler extends Handler
    {
        final WeakReference<MainActivity> mweakReference;//定義對MainActivity的弱引用

        public CountDownHandler(MainActivity  activity) {
            mweakReference = new WeakReference<>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            MainActivity mainActivity = mweakReference.get();//取得對MainActivity的引用
            switch (msg.what)
            {
                case COUNTDOWN:
                {
                    int value = msg.arg1;
                    if(value>=0)
                    {
                        mainActivity.textView.setText(String.valueOf(value--));
                        Message message = Message.obtain();//msg不能複用,必須重新從消息池中獲得實例
                        message.what = COUNTDOWN;
                        message.arg1=value;
                        sendMessageDelayed(message, DELAY_MILLIS);
                    }

                    break;
                }
            }
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章