异步消息处理机制——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中的 ...
随机推荐
- Swift中的设计模式
设计模式(Design Pattern)是 对软件设计中普遍存在的各种问题,所提出的解决方案.这个术语是由埃里希·伽玛等人(Erich Gamma,Richard Helm,Ralph Johnson ...
- powershell 将文本转换成表格的还有一种方式
$text=" 1 梦幻西游 216406 2014-01-21 资料片 2 炉石传说 15905 2014-01-24 公測 3 新大话西游 214465 2002-08-01 公測 4 ...
- JQ动画,背景透明度
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- C#制作简易屏保(转)
C#制作简易屏保[原创] 原始网址: http://www.cnblogs.com/drizzlecrj/archive/2006/10/06/522182.html 2006-10-06 16:25 ...
- PHP扩展开发之简单类开发
接下来我们要用扩展的形式实现以下类(演示环境:linux.php-5.5.34-src) <?php class Person { private $_name; public function ...
- Android 桌面生成快捷方式
Android生成桌面快捷方式的几种方法: //------------以下为动态替换桌面应用Icon的一种解决方案------------------- // 1.获取本地目录图片的Bitmap ; ...
- 计算机模拟(hd1283)
最简单的计算机 Problem Description 一个名叫是PigHeadThree的研究组织设计了一台实验用的计算机,命名为PpMm.PpMm只能执行简单的六种命令A,B,C,D,E,F:只有 ...
- linux之SQL语句简明教程---BETWEEN
IN 这个指令可以让我们依照一或数个不连续 (discrete) 的值的限制之内抓出数据库中的值,而BETWEEN 则是让我们可以运用一个范围 (range) 内抓出数据库中的值.BETWEEN 这个 ...
- [Leetcode][Python]41: First Missing Positive
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 41: First Missing Positivehttps://oj.le ...
- POJ3307+找规律
/* 题意:求第N个productivity property数是谁. (productivity property数:就是这个数可以由另外的数的各个位上的乘积得到.) */ #include< ...