1、子线程给主线程发送数据,主线程作为接收方,主线程处理数据结果。
static Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Loger.e(msg);
}
};
private void test() {
new Thread(new Runnable() {
@Override
public void run() {
mHandler.sendEmptyMessage(-100);
}
}).start();
}
使用static修改,避免Handler 长期持有Activity,引用内存泄漏。
2、子线程作为接收方,专门接收数据,主线程作为发送端进行数据发送
Handler mHandler;
private void test() {
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Loger.e(msg.what);
}
};
Looper.loop();
}
}).start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mHandler.sendEmptyMessage(-100000);
}
3、内存泄漏
使用Handler 容易出现内存泄漏,这也是常遇到的坑,处理办法:
1)使用static进行修饰,静态成员变量就属于整个进程,避免了一直持有Activity
2)当Activity结束的时候,同时想办法结束子线程,子线程结束自然Handler 代码也结束了
3)因为被延时处理的 message 持有 Handler 的引用,Handler 持有对 Activity 的引用,形成了message – handler – activity 这样一条引用链,导致 Activity 的泄露。在onDestroy()中移除Handler 传递的消息
@Override
public void onDestroy() {
// 移除所有消息
handler.removeCallbacksAndMessages(null);
// 或者移除单条消息
// handler.removeMessages(what);
}
4)当Handler的代码中需要使用Activity,使用WeakReference对Activity对象进行包装以后传递给Handler使用。