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.

posted @ 2016-05-10 12:47  沉默的羊癫疯  阅读(1068)  评论(0)    收藏  举报