王学岗handler机制

handler+message机制有四种情况:
1)handler在主线程 使用主线程looper 和 消息队列 在子线程中发送message到消息队列
2)handler在主线程 使用主线程looper 和 消息队列 在主线程中发送message到消息队列
3)handler在主线程,使用子线程的looper和消息队列 在主线程中发送message到消息队列
4)handler在子线 ,使用子线程的looper和消息队列 ,在主线中发送message消息队列
前两种情况比较简单我就不讲了,我们讲讲后面两种不常见的用法
第三种情况:

package com.example.handler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

public class MainActivity extends Activity {

    private TextView tv_text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_text = (TextView) findViewById(R.id.tv_love);
        // 创建一个子线程的looper和消息队列
        HandlerThread myLooperThread = new HandlerThread("my looper thread");
        myLooperThread.start();

        // 拿到子线程的轮询器Looper
        Looper looper = myLooperThread.getLooper();
        /**
         * 此时,主线程和子线程各有一个Messagequeue和Loop而轮询器; 主线程的是系统自己创建的子线程是我们创建的
         */
        // 创建Handler对象,要显示指定Handler对象向哪个轮询器/消息队列发送消息
        final MyHandler myHandler = new MyHandler(looper);
        //点击发送消息
        tv_text.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                tv_text.setText("歼灭来犯之敌");
                myHandler.sendEmptyMessage(1);

            }
        });

    }

    class MyHandler extends Handler {
//      public MyHandler() {
//          super();
//      }

        // 我们使用指定的轮询器,默认的是主线程的轮询器
        public MyHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {



//          tv_text.setText("呜呜呜呜");
            Log.i("zhang_xin", "我是子线程,在处理主线程发送的消息:敌人太强大,打不过了,我投降!");
            super.handleMessage(msg);
        }
    }
}

这里写图片描述

第四种情况

package com.example.handler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends Activity {

    private TextView tv_text;
    private Handler myHandler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_text = (TextView) findViewById(R.id.tv_love);
        new MyThread().start();
        while(myHandler==null){
            //如果myHandler=null,则等待子线程创建Handler对象
        }
        myHandler.sendMessage(Message.obtain());
    }

    class MyThread extends Thread {


        @Override
        public void run() {
         Looper.prepare();
         myHandler = new Handler(){
             @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                Log.i("zhang_xin", "收到主线程发来的消息");           
            }
         };

         Looper.loop();

        }
    }
}

这里写图片描述
注意Looper.prepare()和Looper.loop()两句代码

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qczg_wxg

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值