博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
异步消息处理机制Handler
阅读量:6567 次
发布时间:2019-06-24

本文共 2674 字,大约阅读时间需要 8 分钟。

Android 中的异步消息处理主要由四个部分组成,Message、Handler、MessageQueue 和Looper。

1. Message

Message 是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。(字段有what arg1 arg2 obj)

2. Handler

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

3. MessageQueue

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

对象。

4. Looper

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

 代码实现:

package com.example.androidthreadtest;import android.os.AsyncTask;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.app.ProgressDialog;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class MainActivity extends Activity implements OnClickListener{        private TextView text;    private Button changeText;    //定义了一个整型常量UPDATE_TEXT,表示更新TextView 这个动作    private final static int UPDATE_TEXT=1;    //Handler 重写父类的handleMessage 方法,在这里对具体的Message进行处理    private Handler handler=new Handler(){        public void handleMessage(Message msg){            switch(msg.what){            case UPDATE_TEXT:                text.setText("Nice to Meet your");                break;            default:                break;            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        changeText=(Button) findViewById(R.id.change_text);        text=(TextView) findViewById(R.id.text);        changeText.setOnClickListener(this);    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.main, menu);        return true;    }    @Override    public void onClick(View v) {        // TODO Auto-generated method stub        switch(v.getId()){        case R.id.change_text:            new Thread(new Runnable() {                                @Override                public void run() {                    // TODO Auto-generated method stub                    Message message=new Message();                    message.what=UPDATE_TEXT;                    //发送消息                    handler.sendMessage(message);                }            }).start();        }    }    }

 message.what

  • Message是一个类
  • msg是类Message的一个实例
  • what是实例msg的一个成员变量
  • msg.what = 0是给成员变量what赋值

转载于:https://www.cnblogs.com/lyajs/p/5347990.html

你可能感兴趣的文章
Ubuntu输入正确的用户名密码不能进入系统的原因和解决方法
查看>>
Azure 服务管理 Cmdlet(1)
查看>>
JAVA企业级应用TOMCAT实战
查看>>
用C#计算1000以内含1的数字
查看>>
U-Mail邮件系统的管理权限分配
查看>>
partition table example01 exchange partition
查看>>
Linux只列出目录的几种方式
查看>>
rabbitmq 网络分区错误
查看>>
got github
查看>>
Amazon AutoScaling 自动创建脚本
查看>>
dp、sp和px的区别
查看>>
Azure Stack-1807 版本 配置10分钟、自动部署6小时-我的ASDK第7次实践
查看>>
点击UITableView的cell展开收缩
查看>>
改变,起点
查看>>
Use PowerShell to Replace netdom Commands to Join the Domain
查看>>
模拟实现常用字符串函数
查看>>
关于ping telnet
查看>>
Java 并发编程中使用 ReentrantLock 替代 synchronized 关键字原语
查看>>
Docker私有仓库
查看>>
PHP 自己实现var_dump函数
查看>>