Android基础学习之消息发送使用Looper

利用Looper实现UI线程发送消息给子线程。
用法:
Looper 类

class LooperThread extends Thread {
      public Handler mHandler;
      public void run() {
          Looper.prepare();//step1
          mHandler = new Handler() { //step2
              public void handleMessage(Message msg) {
                  // process incoming messages here
              }
          };
          Looper.loop();//step3
      }
}

示例:
1.xml布局
这里写图片描述
2.java代码

public class MainActivity extends Activity implements OnClickListener {

    private TextView textView;
    private Button button1;
    private Button button2;
    private LooperThread looperThread;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //初始化Looper线程并启动
        looperThread = new LooperThread();
        looperThread.start();

        textView = (TextView) findViewById(R.id.textView1);
        button1 = (Button) findViewById(R.id.button1);
        button2 = (Button) findViewById(R.id.button2);
        button1.setOnClickListener(this);
        button2.setOnClickListener(this);

        textView.append("子线程已经启动\n");
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button1:
            Message message = Message.obtain();//从消息池中获取消息对象,避免重复创建
            message.what = 100;
            looperThread.getWh().sendMessage(message);//利用Looper线程发送消息
            break;
        case R.id.button2:
            Message message1 = Message.obtain();
            message1.what = 400;
            looperThread.getWh().sendMessage(message1);
            break;

        default:
            break;
        }
    }

    private class LooperThread extends Thread {
        private Myhandler wh;

        public synchronized Myhandler getWh() {
            return wh;
        }

        @Override
        public void run() {
            Log.e("ql debug", "子线程开始工作了...名字叫:"
                    + Thread.currentThread().getName());
            Looper.prepare();// 1.初始化当前线程用的looper对象
            wh = new Myhandler();// 2.初始化好handler对象
            Message msg = Message.obtain();
            msg.what = 200;
            wh.sendMessage(msg);
            //当Looper被执行终止时才会跳出循环,执行后面的语句
            Looper.loop();// 3.当前线程的looper对象开始工作了. 进入looper世界
            Log.e("ql debug", "子线程的looper循环被终止");
        }

        private class Myhandler extends Handler {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (msg.what == 100) {
                    Log.e("ql debug",
                            "子线程收到主线程发来的消息,时间是:" + System.currentTimeMillis());
                }
                if (msg.what == 400) {
                    Log.e("ql debug",
                            "子线程收到主线程发来的停止循环消息,时间是:"
                                    + System.currentTimeMillis());
                    wh.getLooper().quit();// 终止looper循环
                }
                if (msg.what == 200) {
                    Log.e("robin debug",
                            "子线程收到子线程发来的消息,时间是:" + System.currentTimeMillis());
                }
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值