• 异步消息处理机制——Handler用法


    Handler

    1. Message

      Messsge是线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据,Message的what字段,除此之外还可以使用arg1和arg2字段来携带一些整型数据,使用Obj字段携带一个Object对象。

    2.Handler

      Handler处理者的意思,它主要用于发送和处理消息。发送消息一般使用Handler 的sendMessage方法,而发送消息经过一系列的辗转处理后,最终会传递到Handler的handleMessage()方法中。

    3.MessageQueue

      MessageQueue是消息队列的意思,它主要用于存放所有通过Handler发送的消息。这部分消息会一直存在于消息队列中,等待被处理。每一个线程中只会有一个MessageQueue对象。

    4.Looper

      Looper是每一个线程中的MessageQueue的管家,调用Looper的Loop()方法后,就会进入到一个无线循环当中,然后每当发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的handleMessage()方法中。每个线程中只会有一个Looper对象。

    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class MainActivity extends Activity {
    
        private Button button;
        private Handler handler;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            button = (Button) findViewById(R.id.button);
            button.setOnClickListener(new ButtonListener());
            handler = new FirstHandler();
        }
        
        public class ButtonListener implements OnClickListener {
            @Override
            public void onClick(View v) {
                //当用户点击按钮时,我们创建一个消息对象,并用Handler发送该对象。
                Message msg = handler.obtainMessage();
                msg.what = 2;
                handler.sendMessage(msg);
                //上面一行代码将消息对象放置到消息队列中
                //1.Looper将会从消息队列中将将消息对象取出。
                //2.Looper将会找到与消息对象对应的Handler对象。
                //3.Looper将会调用handler对象的HandleMessage(Message msg)方法,用于处理消息对象
            }
        }
        
        public class FirstHandler extends Handler {
            @Override
            public void handleMessage(Message msg) {
           int what = msg.what; Log.d(
    "MainActivity", "msg: " + what); } } }

    MainThread向WorkerThread发送数据

    public class MainActivity extends Activity {
    
        private Button button;
        private Handler handler;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            button = (Button) findViewById(R.id.button);
            button.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    Log.d("MainActivity", "Thread------->" + Thread.currentThread().getName());
                    Message msg = handler.obtainMessage();
                    msg.what = 100;
                    handler.sendMessage(msg);
                }
            });
            Thread t = new NetworkThread();
            t.start();
        }
        
        public class NetworkThread extends Thread {
            
            @Override
            public void run() {
                //准备Looper对象
                Looper.prepare();
                //在workthread当中生成一个Handler对象
                handler = new Handler() {
                    public void handleMessage(Message msg) {
                        Log.d("MainActivity", "Thread------->" + Thread.currentThread().getName());
                        int what = msg.what;
                        Log.d("MainActivity", "what: " + what);
                    }
                };
                //调用Looper的loop()方法之后,Looper对象将不断的从消息队列当中取出消息对象,然后调用Handler的handleMessage()方法处理消息对象。
                //如果消息队列当中没有对象,则该线程阻塞。
                Looper.loop();
            }       
        }
        
    }
  • 相关阅读:
    Nagios 监控网络流量(Windows主机和交换机)
    Nagios监控Windows服务器(NSClient++安装与应用)
    Mysql源码安装
    NETSNMP配置
    Linux 下文件解压
    cacti没有图像 排错
    菜鸟写游戏外挂
    什么是IDOC,以及IDOC的步骤
    后台跑程序(仿SM36)
    smartforms参数
  • 原文地址:https://www.cnblogs.com/wuyong0818/p/4802296.html
Copyright © 2020-2023  润新知