消息机制和UI处理

Android中需要在主线程中处理UI问题。通过Handler处理消息。
具体说明见示例。

LooperThread.java

    class LooperThread extends Thread {

        public Handler mHandler;

        public TextView tv;

        public LooperThread(TextView tv, Handler mHandler) {
            this.tv = tv;
            this.mHandler = mHandler;
        }
        @Override
        public void run() {
            //子线程的looper不是默认开启的,需要先调用prepare()方法
            Looper.prepare();
            Log.d("zhty", "thread Thread.currentThread().getId():" + Thread.currentThread().getId());
            Log.d("zhty", "prepare");
            mHandler = new Handler() {

                @Override
                public void handleMessage(Message msg) {
                    //这里会报错
//                  tv.setText("线程的handler不可以处理UI");
                    Looper.myLooper().quit();
                }
            };
            Log.d("zhty", "Looper.myLooper():" + Looper.myLooper());
            //就是构造时传入的looper
            Log.d("zhty", "mHandler.getLooper():" + mHandler.getLooper());
            Log.d("zhty", "Looper.getMainLooper():" + Looper.getMainLooper());
            //post()的方式.也是封装成message发送到线程的消息队列
             mHandler.post(new Runnable() {
                 @Override
                 public void run() {
                     tv.setText("post的方式处理,发送到了消息队列里");
                 }
            });
            Log.d("zhty", "loop");
            //sendMessage()的方式
            new Thread(new Runnable() {

                @Override
                public void run() {
                    Log.d("zhty", "thread in thread Thread.currentThread().getId():" + Thread.currentThread().getId());
                    Message msgMessage = new Message();
                    mHandler.sendMessage(msgMessage);
                }
            }).start();
            //阻塞的方法,调用quit()方法结束
            Looper.loop();
            Log.d("zhty", "after loop");
        }
    }

调用方法:

    public void handlerTest() {
        final TextView tv = (TextView) findViewById(R.id.tv);
        Log.d("zhty", "main Thread.currentThread().getId():" + Thread.currentThread().getId());
        //在主线程创建Handler,默认传入的是Looper.getMainLooper
        Handler mHandler = new Handler() {

            @Override
            public void handleMessage(Message msg) {
                tv.setText("主线程的handler可以处理UI");
                //主线程的looper不可以执行quit()
//              Looper.myLooper().quit();
            }
        };
        new LooperThread(tv, mHandler).start();
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值