Android高級進階之多線程(一)handler+Thread

  本文主要實現了handler+Thread通信的方式,實現了多線程之間的通信,期間爲了避免內存泄漏,在ondestory方法中對線程中的方法進行了終止了處理。然後對直接new Handler會出現This Handler should be static or leaks might occor的警告信息進行了處理,採用靜態內部類+弱引用的方式進行了改進。實現如下:

package com.example.androidreview.multithread;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;

import com.example.androidreview.R;

import java.lang.ref.WeakReference;

public class MultiThreadActivity extends Activity {
    private MyHandler mHandler = new MyHandler(this);
    private TextView mHandlerText = null;
    private static final String TAG = "MultiThreadActivityTAG";
    private Thread mThread = null;
    private volatile boolean isDestroy = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_multi_thread);
        Log.d(TAG,"onCreate");
        testHandler();
    }

    private void testHandler() {
        mHandlerText = findViewById(R.id.handler_text);
        mThread = new Thread(new Runnable() {
            @Override
            public void run() {
                int i=100;
                while (i>0&&!isDestroy){
                    i--;
                    try {
                        Log.d(TAG,"SEND MESSAGE "+i);
                        Message message = new Message();
                        message.what = 0;
                        message.obj = i;
                        mHandler.sendMessage(message);
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        mThread.start();
    }

    static class MyHandler extends Handler {
        WeakReference<MultiThreadActivity> mActivity;

        MyHandler(MultiThreadActivity activity) {
            mActivity = new WeakReference<MultiThreadActivity>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            MultiThreadActivity theActivity = mActivity.get();
            switch (msg.what) {
                case 0:
                    Log.d(TAG,"get MESSAGE "+msg.obj);
                    theActivity.mHandlerText.setText(((int) msg.obj+""));
                    break;
            }
        }
    }

    @Override
    protected void onStart() {
        Log.d(TAG,"onStart");
        super.onStart();
    }

    @Override
    protected void onRestart() {
        Log.d(TAG,"onRestart");
        super.onRestart();
    }

    @Override
    protected void onResume() {
        Log.d(TAG,"onResume");
        super.onResume();
    }

    @Override
    protected void onPause() {
        Log.d(TAG,"onPause");
        super.onPause();
    }

    @Override
    protected void onStop() {
        Log.d(TAG,"onStop");
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        isDestroy = true;
        Log.d(TAG,"onDestroy");
        super.onDestroy();
    }
}

打開界面一會後關閉界面的log:

11-24 11:38:09.765 8579-8579/? D/MultiThreadActivityTAG: onCreate
11-24 11:38:09.766 8579-8607/? D/MultiThreadActivityTAG: SEND MESSAGE 99
11-24 11:38:09.767 8579-8579/? D/MultiThreadActivityTAG: onStart
11-24 11:38:09.768 8579-8579/? D/MultiThreadActivityTAG: onResume
11-24 11:38:09.803 8579-8579/? D/MultiThreadActivityTAG: get MESSAGE 99
11-24 11:38:10.767 8579-8607/com.example.androidreview D/MultiThreadActivityTAG: SEND MESSAGE 98
11-24 11:38:10.767 8579-8579/com.example.androidreview D/MultiThreadActivityTAG: get MESSAGE 98
11-24 11:38:11.767 8579-8607/com.example.androidreview D/MultiThreadActivityTAG: SEND MESSAGE 97
11-24 11:38:11.767 8579-8579/com.example.androidreview D/MultiThreadActivityTAG: get MESSAGE 97
11-24 11:38:12.768 8579-8607/com.example.androidreview D/MultiThreadActivityTAG: SEND MESSAGE 96
11-24 11:38:12.768 8579-8579/com.example.androidreview D/MultiThreadActivityTAG: get MESSAGE 96
11-24 11:38:13.768 8579-8607/com.example.androidreview D/MultiThreadActivityTAG: SEND MESSAGE 95
11-24 11:38:13.768 8579-8579/com.example.androidreview D/MultiThreadActivityTAG: get MESSAGE 95
11-24 11:38:14.769 8579-8607/com.example.androidreview D/MultiThreadActivityTAG: SEND MESSAGE 94
11-24 11:38:14.770 8579-8579/com.example.androidreview D/MultiThreadActivityTAG: get MESSAGE 94
11-24 11:38:15.770 8579-8607/com.example.androidreview D/MultiThreadActivityTAG: SEND MESSAGE 93
11-24 11:38:15.770 8579-8579/com.example.androidreview D/MultiThreadActivityTAG: get MESSAGE 93
11-24 11:38:16.770 8579-8607/com.example.androidreview D/MultiThreadActivityTAG: SEND MESSAGE 92
11-24 11:38:16.771 8579-8579/com.example.androidreview D/MultiThreadActivityTAG: get MESSAGE 92
11-24 11:38:17.771 8579-8607/com.example.androidreview D/MultiThreadActivityTAG: SEND MESSAGE 91
11-24 11:38:17.772 8579-8579/com.example.androidreview D/MultiThreadActivityTAG: get MESSAGE 91
11-24 11:38:18.772 8579-8607/com.example.androidreview D/MultiThreadActivityTAG: SEND MESSAGE 90
11-24 11:38:18.773 8579-8579/com.example.androidreview D/MultiThreadActivityTAG: get MESSAGE 90
11-24 11:38:19.629 8579-8579/com.example.androidreview D/MultiThreadActivityTAG: onPause
11-24 11:38:19.772 8579-8607/com.example.androidreview D/MultiThreadActivityTAG: SEND MESSAGE 89
11-24 11:38:19.772 8579-8579/com.example.androidreview D/MultiThreadActivityTAG: get MESSAGE 89
11-24 11:38:19.879 8579-8579/com.example.androidreview D/MultiThreadActivityTAG: onStop
11-24 11:38:19.884 8579-8579/com.example.androidreview D/MultiThreadActivityTAG: onDestroy

針對這裏的線程,如果在onDestroy中不作終止處理,那麼在activity關閉之後,該線程依然會執行,從而會造成內存泄漏的情況發生。

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