异步消息处理机制——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();
        }
    }
}
异步消息处理机制——Handler用法的更多相关文章
- Android开发之异步消息处理机制Handler
		
更加详细的介绍Handler的博文-http://blog.csdn.net/guolin_blog/article/details/9991569 Android中的异步消息处理主要有四个部分组成, ...
 - 异步消息处理机制Handler
		
Android 中的异步消息处理主要由四个部分组成,Message.Handler.MessageQueue 和Looper. 1. Message Message 是在线程之间传递的消息,它可以在内 ...
 - Android 异步消息处理机制终结篇 :深入理解 Looper、Handler、Message、MessageQueue四者关系
		
版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.概述 我们知道更新UI操作我们需要在UI线程中操作,如果在子线程中更新UI会发生异常可能导致崩溃,但是在UI线程中进行耗时操作又会导致ANR,这 ...
 - Android多线程----异步消息处理机制之Handler详解
		
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
 - 【转】Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
		
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38377229 ,本文出自[张鸿洋的博客] 很多人面试肯定都被问到过,请问Andr ...
 - Android 异步消息处理机制 让你在深入了解 Looper、Handler、Message之间的关系
		
转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/38377229 ,本文出自[张鸿洋的博客] 非常多人面试肯定都被问到过,请问And ...
 - Android Handler 异步消息处理机制的妙用 创建强大的图片加载类(转)
		
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38476887 ,本文出自[张鸿洋的博客] 最近创建了一个群,方便大家交流,群号: ...
 - Android线程之异步消息处理机制(二)——Message、Handler、MessageQueue和Looper
		
异步消息处理机制解析 Android中的异步消息处理主要有四个部分组成,Message.Handler.MessageQueue和Looper. 1.Message Message是在线程之间传递的消 ...
 - Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
		
转自:http://blog.csdn.net/lmj623565791/article/details/38377229 ,本文出自[张鸿洋的博客] 很多人面试肯定都被问到过,请问Android中的 ...
 
随机推荐
- SQLServer查询逻辑读最高的语句
			
select top 25 p.name as [SP Name], deps.total_logical_reads as [TotalLogicalReads], deps.total_logic ...
 - MySQL ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO
			
MySQL安装完server端和客户端后,登录Mysql时报错:[root@rhel204 MySQL 5.6.23-RMP]# mysqlERROR 2002 (HY000): Can't conn ...
 - Xcode5 配置 github
			
首先,要在github上,进行如下的操作: 1. github 官网 https://github.com 注册github账号. 2. 创建一个repository,命名为项目的名称,如 Gith ...
 - NSString 字符串操作
			
//一.NSString /*----------------创建字符串的方法----------------*/ //1.创建常量字符串. NSString *astring = @"Th ...
 - stack 集合栈计算机 (摘)
			
有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始为空的栈,并且支持以下操作:PUSH:空集“{}”入栈DUP:把当前栈顶元素复制一份后再入栈UNION:出栈两个集合,然后把两者的并集入 ...
 - Activity之间的跳转
			
/* * 触发按钮bt1跳转到另一个Activity */ bt1.setOnClickListener(new OnClickListener() { @Override public void o ...
 - c++ iostream 相关使用
			
索引: C++的iostream标准库介绍+使用详解(转) iostream格式化输出 c++ 字符串流 sstream(常用于格式转换) 关于#include <iomanip>中iom ...
 - JQuery中如何动态修改input的type属性
			
代码如下: jQuery(".member_id").focus(function() { jQuery(this).val(''); }).blur(function() { i ...
 - C语言基础09
			
指向结构体变量的指针叫做结构体指针: typedef struct { int num; char name[30]; // char *name; 程序会崩溃,*name本身是指针,没有什么空 ...
 - 转:C4项目中验证用户登录一个特性就搞定
			
转:C4项目中验证用户登录一个特性就搞定 在开发过程中,需要用户登陆才能访问指定的页面这种功能,微软已经提供了这个特性. // 摘要: // 表示一个特性,该特性用于限制调用 ...