zoukankan      html  css  js  c++  java
  • Android学习笔记(十三) Handler

    可用于解决上一则笔记所提到的WorkerThread无法修改UI控件的问题

    一、Handler、Looper和MessageQueue的基本原理

      Handler把消息对象放到MessageQueue当中,而Looper负责在消息队列头部不断取出消息对象。取出的对象再交给Handler处理。

    二、一个简单的Handler例子

      -先创建一个继承Handler的类,注意是导入Android.os.Handler(非常重要)
        class firstHandler extends Handler{}

      -复写方法handleMessage(Message msg)

      -创建Handler对象
        handler = firstHandler()

      -生成一个Message,并且给what成员变量赋值
        Message msg = handler.obtainMessage();
        msg.what = 2;

      -将消息对象放置到消息队列中。
        handler.sendMessage(msg);

      -Looper将会从消息队列当中将消息对象取出;
      -Looper将会找到与消息对象对应的Handler对接(每一个Message对象都有与之对应的Handler对象);
      -Looper将会调用Handler对象的handleMessage(Message msg)方法,用于处理消息对象。

    三、在主线程当中实现Handler的handleMessage()方法

      注:不管是在WorkerThread还是在MainThread中都可以发送消息,即:handler.sendMessage(Message msg)

      1)在新建线程的run()中发送Message:

        class NetworkThread extends Thread{
            @Override
            public void run(){
                String s = "模拟从网络中获取的数据";
                Message msg = handler.obtainMessage();
                msg.obj = s;
                handler.sendMessage(msg);    
            }
        }                    

      2)复写handleMessage()方法。因为这个方法是被主线程调用的,所可以更改UI。

    class MyHandler extends Handler{
        @Override
        public void handleMessage(Message msg){
            tring s = (String)msg.obj;
            textView.setText(s);
        }
    }

     四、主线程向WorkerThread发送数据

      1)在WorkerThread中

    //在WorkerThread当中启动Looper,重写Handler的handleMessage()方法
    //如果是MainThread接收消息则不需要写Looper的方法,只需要写handleMessage()方法
    class WorkerThread extends Thread{
        @Override
        public void run(){
            //准备Looper对象
            Looper.prepare();
            //在WorkerThread当中生成Handler对象
            handler = new handler(){
                @Override
                public void handleMessage(Message msg){
                
                }
            }
            //调用Looper的loop()方法之后,Looper对象将不断地从消息队列中取出消息对象,然后调用handler的handleMessage()方法,处理该消息对象
            //如果消息队列当中没有对象,则该线程阻塞
            Looper.loop();
        }
    }
    //启动WorkerThread线程
    WorkerThread wt = new WorkerThread();
    wt.start;

      2)在MainThread中

    //在MainThread中发送消息(利用Button)
    button.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View view){
            Message msg = handler.obtainMessage();
            handler.sendMessage(msg);
        }
    })
  • 相关阅读:
    语文文法
    1223 递归下降语法分析程序设计
    有穷的自动机构造
    文法分析
    text
    0916 词法分析(3)
    "firstday"-软件工程
    实验四 递归下降语法分析程序设计
    构造该正规式的有穷状态自动机
    评论
  • 原文地址:https://www.cnblogs.com/viaduct/p/6388010.html
Copyright © 2011-2022 走看看