6 主线程与子线程之间的信息交互
6-1 主线程与子线程之间的信息交互 (10:33)
1.子线程通过 HandlerThread的thread.getLooper()绑定,
2.在主线程的handler的handlerMessage中调用threadHandler.sendMessageDelay(msg,1000);向子线程发送消息。
3.在子线程中通过handler.sendMessageDelay(msg,1000);向主线程发送消息
4.在一个启动点btn调用主线程的handler.sendEmptyMessage(int x);
5.在一个结束点btn调用handler.removeMessages(x);
-----------------------------------------------------
主线程和子线程之间如何相互通信:
1. 子线程向主线程发送消息,必须有主线程的Handler,该Hnadler绑定了主线程的Looper。
2. 主线程向子线程发送消息,必须有子线程的Looper,为了防止Looper没有初始化,所以通过HandlerThread类,来保证子线程的Looper再被主线程调用时已经初始化。
package com.example.yzx; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class FourActivity extends Activity implements OnClickListener { // 创建主线程的handler private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { Message message = new Message(); System.out.println("main Handler"); // 像子线程发送消息 threadHandler.sendMessageDelayed(message, 1000); }; }; private Handler threadHandler; private Button button1, button2; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.four); button1 = (Button) findViewById(R.id.button1); button2 = (Button) findViewById(R.id.button2); button1.setOnClickListener(this); button2.setOnClickListener(this); HandlerThread thread = new HandlerThread("handlerThread"); thread.start(); // 创建子线程的handler threadHandler = new Handler(thread.getLooper()) { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub Message message = new Message(); System.out.println("thread Handler"); // 向主线程发送消息 handler.sendMessageDelayed(message, 1000); } }; } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.button1: handler.sendEmptyMessage(1); break; case R.id.button2: handler.removeMessages(1); break; default: break; } } }

1. 子线程处理消息的过程中向主线程发送了消息。
2. 主线程处理消息的过程中又向子线程发送了消息。
消息直接循环起来了。
----------------------------
按“stop”停止不了,是因为:
停止发送,使用handler的removeMessages()方法,视频中what的值给了1,所以停止不了,应该使用0.

浙公网安备 33010602011771号