/**
* 主线程给子线程发送消息
*/
public class HandlerTest3Activity extends AppCompatActivity {
@BindView(R.id.tv)
TextView tv;
@BindView(R.id.btn1)
Button btn1;
Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler_test3);
ButterKnife.bind(this);
new MyThread().start();
}
@OnClick(R.id.btn1)
public void onViewClicked() {
Message message = handler.obtainMessage();
message.arg1 = 1;
message.obj = "obj消息";
handler.sendMessage(message);
LogUtils.e(Thread.currentThread().getName());
}
/**
* 由此可见,子线程中是可以创建handler的,不过前提是要获取到Looper
* 子线程中创建handler的三个步骤:
* 1、Looper.prepare();
* 2、创建
* 3、Looper.loop();
*/
class MyThread extends Thread {
@SuppressLint("HandlerLeak")
@Override
public void run() {
Looper.prepare();
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
LogUtils.e(Thread.currentThread().getName());
LogUtils.e(msg.what + " - " + msg.obj);
super.handleMessage(msg);
}
};
Looper.loop();
super.run();
}
}
}
/**
* 子线程给主线程发送消息
*/
public class HandlerTest4Activity extends AppCompatActivity {
@BindView(R.id.tv)
TextView tv;
@BindView(R.id.btn1)
Button btn1;
/**
* 在主线程定义一个Handler
*/
@SuppressLint("HandlerLeak")
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
LogUtils.e(Thread.currentThread().getName());
LogUtils.e("消息:" + msg.what + " - " + msg.obj);
tv.setText("消息:" + msg.what + " - " + msg.obj);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler_test4);
ButterKnife.bind(this);
}
/**
* 在点击事件中开启一个子线程
*/
@OnClick(R.id.btn1)
public void onViewClicked() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Message message = handler.obtainMessage();
message.arg1 = 1;
message.obj = "obj消息";
handler.sendMessage(message);
LogUtils.e(Thread.currentThread().getName());
}
});
thread.start();
}
}