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

原文: [置顶] Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue

  当一个程序第一次启动时,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();

		}

	}

	

}

运行结果:
Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue






你可能感兴趣的:(messagequeue)