核心思想:为子线程手动创建looper对象,绑定mQueue,建立持有这个mQueue的handler对象,并调用looper.loop()方法阻塞线程,等待接收到消息后交给handler处理,使用完成后要调用looper.quit()结束线程,释放资源
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_send;
private Handler handler;
private Looper looper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initSubThread();
}
private void initSubThread() {
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();//把main thread中自动执行的方法手动执行,为SubThread绑定Looper和消息队列mQueue
looper = Looper.myLooper();//从子线程获取和子线程绑定的looper对象
handler = new Handler() {//这个在子线程中创建的handler是绑定到子线程中的
@Override
public void handleMessage(Message msg) {
Toast.makeText(MainActivity.this, "在subThread中收到了:"+msg.obj, Toast.LENGTH_SHORT).show();//Toast底层依靠的就是looper环境 因为现在子线程有了looper环境,所以现在子线程也可以弹Toast
}
};
Looper.loop();//手动开启loop()方法用里面的无尽循环阻塞线程 等待接收消息,收到消息后就给handler处理
Log.w("sub Thread", "我执行了子线程就结束了");
}
}).start();
}
private void initView() {
btn_send = (Button) findViewById(R.id.btn_send);
btn_send.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_send:
send();
break;
}
}
private void send() {
handler.obtainMessage(1,"main thread 发送的").sendToTarget();
}
@Override
protected void onDestroy() {
super.onDestroy();
// handler.getLooper().quit();//在MainActivity destroy前调用子线程looper.quit()结束子线程 释放资源
looper.quit();//这个looper和上一句的looper是同一对象 效果相同
}
}