Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue
来源:互联网 发布:网络销售用语 编辑:程序博客网 时间:2024/06/09 15:44
当一个程序第一次启动时,Android会启动一条主线程(Main Thread),主线程主要负责处理与UI相关的事件,如按键事件、触屏事件、绘图事件,主线程也被称为UI线程。
UI的操作只能是通过主线程来操作,为了解决多线程操作UI的问题,就用到了Handler类。
一、Handler类
二、Handler、Looper、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系统源码可以看到:程序创建时Looper会在它的构造器中创建MessageQueue对象。
- private Looper() {
- mQueue = new MessageQueue();
- mRun = true;
- mThread = Thread.currentThread();
- }
handlerMessage方法位于主线程,可以处理UI.
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();
- }
- }
- }
0 0
- Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue
- Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue
- Android Handler、Loop、MessageQueue的工作原理
- Android Handler (Loop MessageQueue) 解析
- android基础--Handler,Loop,MessageQueue
- Handler、Loop、MessageQueue的关系
- Android---28---Handler、Loop、MessageQueue的工作原理:
- Android菜鸟的成长笔记(20)——IntentService
- Android菜鸟的成长笔记(20)——IntentService
- Handler, Loop, MessageQueue的工作原理
- Handler、Loop、MessageQueue的工作原理
- Handler、Loop、MessageQueue的工作原理
- Handler、Loop、MessageQueue的工作原理<温故知新>
- Handler、Loop和MessageQueue
- Handler、Loop、MessageQueue
- Android菜鸟的成长笔记——Eclipse使用小结
- Android菜鸟的成长笔记——编码规范什么的
- Android菜鸟的成长笔记——初识Activity
- IDE开发工具集合
- iOS程序员如何面试
- 玩转 Java Web 应用开发:Play 框架(拯救程序猿神器)
- c++初学者
- <link rel="apple-touch-icon-precomposed"/> 的说明
- Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue
- 数据库设计三大范式
- char *p、const char *p
- python 处理大数据
- 华中科技大学2000___考研计算机_复试上机
- 黑马程序员-------交通灯管理系统
- Android菜鸟的成长笔记(13)——异步任务(Async Task)
- win7下NuGet 服务器部署
- 基于图模型并支持查询语言的新型元数据管理方法