本文主要实现了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关闭之后,该线程依然会执行,从而会造成内存泄漏的情况发生。