您的位置:首页 > 产品设计 > UI/UE

Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue

2014-04-16 09:19 399 查看
当一个程序第一次启动时,Android会启动一条主线程(Main Thread),主线程主要负责处理与UI相关的事件,如按键事件、触屏事件、绘图事件,主线程也被称为UI线程。
UI的操作只能是通过主线程来操作,为了解决多线程操作UI的问题,就用到了Handler类。
一、Handler类

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();

}

}



}

运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: