本文主要實現了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關閉之後,該線程依然會執行,從而會造成內存泄漏的情況發生。