Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue
原文:[置顶] Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue
Handler类的作用有两个:1、在新启动的线程中发送消息。2、在主线程中获取、处理消息。例如:package com.example.testlistener; import java.util.Timer;
import java.util.TimerTask; import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends Activity {
EditText txt;
final Handler hander = new Handler(){
public void handleMessage(android.os.Message msg) {
if(msg.what == 0x1234){
Toast.makeText(MainActivity.this, msg.arg1 + "", 1000).show();
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); new Timer().schedule(new TimerTask() {
int i = 0;
@Override
public void run() {
i++;
Message msg = new Message();
msg.what = 0x1234;
msg.arg1 = i;
hander.sendMessage(msg);
}
}, 0, 2000);
} }Message是Hander接收和处理的消息对象。通过向Message中添加消息,将消息放入消息队列MessageQueue,然后通过Looper方法读取MessageQueue。打开Android系统源码可以看到:private Looper() {
mQueue = new MessageQueue();
mRun = true;
mThread = Thread.currentThread();
}程序创建时Looper会在它的构造器中创建MessageQueue对象。
handlerMessage方法位于主线程,可以处理UI.
二、Handler、Looper、MessageQueue的工作原理
Looper:每个线程只有一个Looper,负责管理MessageQueue,会不断地从MessageQueue中取出消息,并将消息分给对应的Handler处理。MessageQueue:由Looper负责管理,采用先进先出的方式管理Message(消息队列).Handler:把消息发送给Looper管理的MessageQueue并负责处理Looper分给它的消息。为了保证当前线程中有Looper对象,有如下两种情况:1、主UI线程中,系统已经初始化了一个Looper对象,因此程序直接创建Handler即可。2、自己定义的子线程,必须先创建一个Looper对象,并启动它。例如:将上面的例子加以修改package com.example.testlistener; import java.util.Timer;
import java.util.TimerTask; import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends Activity {
EditText txt;
Button bt;
TestThread testThread;
int j = 0;
final Handler hander = new Handler(){
public void handleMessage(android.os.Message msg) {
if(msg.what == 0x1234){
Toast.makeText(MainActivity.this, msg.arg1 + "", 1000).show();
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt = (EditText) findViewById(R.id.txt);
bt = (Button) findViewById(R.id.bn);
testThread = new TestThread();
testThread.start();
bt.setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
j++;
Message msg = new Message();
msg.what = 0x1000;
msg.arg1 = j;
testThread.thander.sendMessage(msg);
}
}); new Timer().schedule(new TimerTask() {
int i = 0;
@Override
public void run() {
i++;
Message msg = new Message();
msg.what = 0x1234;
msg.arg1 = i;
hander.sendMessage(msg);
}
}, 0, 2000);
} //自定义子线程
class TestThread extends Thread{
public Handler thander;
@Override
public void run() {
//创建一个Looper对象
Looper.prepare();
thander = new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what == 0x1000){
System.out.println("j = " + msg.arg1);
//txt.setText(msg.arg1 + "");
}
}
};
//启动Looper
Looper.loop();
}
} }运行结果:
![]()
Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue的更多相关文章
- Android菜鸟的成长笔记(3)——给QQ登录界面说So Easy
原文:Android菜鸟的成长笔记(3)--给QQ登录界面说So Easy 上一篇:Android菜鸟的成长笔记(2)--第一个Android应用 我们前面已经做了第一个Android应用程序,虽然有 ...
- Android菜鸟的成长笔记(2)——第一个Android应用
原文:Android菜鸟的成长笔记(2)--第一个Android应用 上一篇:Android菜鸟的成长笔记(1)--Anddroid环境搭建从入门到精通 在上一篇Android菜鸟的成长笔记(1)中我 ...
- Android菜鸟的成长笔记(1)——Android开发环境搭建从入门到精通
原文:Android菜鸟的成长笔记(1)--Android开发环境搭建从入门到精通 今天在博客中看到好多Android的初学者对Android的开发环境的搭建不熟悉而导致不能进行学习,所以我决定自己写 ...
- Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上)
原文:[置顶] Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上) 我们在用手机的时候可能会发现,即使应用被放到后台再返回到前台数据依然保留(比如说我们正在玩游戏,突然电话 ...
- Android菜鸟的成长笔记(13)——异步任务(Async Task)
原文:[置顶] Android菜鸟的成长笔记(13)——异步任务(Async Task) Android的UI线程主要负责处理用户的事件及图形显示,因此主线程UI不能阻塞,否则会弹出一个ANR(App ...
- Android菜鸟的成长笔记(11)——Android中的事件处理
原文:[置顶] Android菜鸟的成长笔记(11)——Android中的事件处理 Android提供了两种方式来处理事件,一个是基于回调的事件处理,另一个是基于监听的事件处理,举个例子: 基于回调的 ...
- Android菜鸟的成长笔记(10)——使用Bundle在Activity之间传值
原文:[置顶] Android菜鸟的成长笔记(10)——使用Bundle在Activity之间传值 前面我们了解了如何启动一个Activity,一个Activity在启动另外一个Activity的时候 ...
- Android菜鸟的成长笔记(9)——Intent与Intent Filter(下)
原文:[置顶] Android菜鸟的成长笔记(9)——Intent与Intent Filter(下) 接着上一篇的内容,下面我们再来看看Intent的Data与Type属性. 一.Data属性与Typ ...
- Android菜鸟的成长笔记(8)——Intent与Intent Filter(上)
原文:[置顶] Android菜鸟的成长笔记(8)——Intent与Intent Filter(上) Intent代表了Android应用的启动“意图”,Android应用将会根据Intent来启动指 ...
随机推荐
- Flowers(二分水过。。。)
Flowers Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- 联想K82------智能电视行业的野蛮入侵者
智能电视行业近年来“渐入佳境”,一方面得力于智能手机.平板电脑的普及让数码产品的智能化趋势深入人心,智能电视自然成了IT行业的下一个增长点:另一方面则得力于部分企业敢于第一个吃螃蟹,通过他们的创新和开 ...
- MySQL分组数据
分组 理解分组能够看例如以下一个样例,首先我们打印出products表例如以下 从上面的表中能够看出.每一个vendor都有若干个产品,那么怎么一次统计每一个vendor有多少个产品呢? 这里就能够使 ...
- C#动态增加边框
if (this.Width >= 600) { timer1.Enabled = false; } else { this.Width += 30; }
- 网页制作之JavaScript部分 1 - 语法(复制教材内容)
一.简介 1.JavaScript它是个什么东西? 它是个脚本语言,需要有宿主文件,他的宿主文件是html文件. 2.它与Java有什么关系? 没有什么直接联系,java是Sun公司(已经没有了,被O ...
- servlet 将输入内容通过拼接页面的方式显示出来
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- 四、Nginx负载均衡upstream
user www; worker_processes ; error_log /usr/local/nginx/logs/error.log crit; pid /usr/local/nginx/lo ...
- 我的Python成长之路---第一天---Python基础(6)---2015年12月26日(雾霾)
七.列表——list Python的列表是一种内置的数据类型,是由Python的基本数据类型组成的有序的集合.有点类似C语言的数组,但与数组不同的是,Python在定义列表的时候不用指定列表的容积(长 ...
- [置顶] 搭建apache+tomcat+memcached集群环境
一.搭建apache server服务器 1.apache server图示:(加载图片要一张一张,所以可以到下面网站下载带图片的word) http://download.csdn.net/user ...
- Silk Icons —— 再来 700 个免费小图标
http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5NzM0MjcyMQ==&appmsgid=10000977&itemidx=2&am ...