码迷,mamicode.com
首页 > 移动开发 > 详细

Android---28---Handler、Loop、MessageQueue的工作原理:

时间:2015-04-22 22:17:14      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:android开发   handler   looper   messagequeue   

Handler、Loop、MessageQueue的工作原理:

先介绍一下这几个组件:
Message:Handler接收和处理的消息对象

Looper:读取MessageQueue中的消息,并将读到的消息发送给Handler进行处理

MessageQueue:消息存储队列。



技术分享


程序使用Handler发送消息,被发送的消息必须被指定到MessageQueue中,也就是说Handler能正常工作,必须保证当前线程中有一个MessageQueue,又因为MessageQueue是由Looper负责管理的,必须要有一个Looper对象。

 

如何创建一个Looper对象:

在主UI线程中,系统已经初始化了一个Looper对象,,因此程序可直接创建Handler对象

在自定义线程中,必须自己创建一个Looper对象,并启动它。创建方法:调用Loop.prepare()即可。

 

Prepare方法保证每个线程中只会有一个Looper对象。

 

然后调用Looper.loop()方法启动。loop方法使用一个死循环不断从MessageQueue中取出消息,直到MessageQueue为空,并将取出的消息发送给Handler进行处理。





使用新线程计算质数:



MainActivity.java:

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.lang.*;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends Activity implements OnClickListener {

	private EditText etNum;
	static final String UPPER_NUM = "upper";
	CalThread calThread;
	private TextView textView;

	class CalThread extends Thread {
		public Handler mHandler;

		public void run() {
			Looper.prepare();
			mHandler = new Handler() {

				@Override
				public void handleMessage(Message msg) {
					// TODO Auto-generated method stub
					super.handleMessage(msg);

					if (msg.what == 0x123) {
						int upper = msg.getData().getInt(UPPER_NUM);
						List<Integer> nums = new ArrayList<Integer>();
						outer: for (int i = 2; i <= upper; i++) {
							for (int j = 2; j <= Math.sqrt(i); j++) {
								if (i != 2 && i % j == 0) {
									continue outer;
								}
							}
							nums.add(i);
						}
						Toast.makeText(MainActivity.this, nums.toString(), 1)
								.show();
						
					}

				}

			};
			Looper.loop();
		}
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		etNum = (EditText) findViewById(R.id.etNum);
		Button button = (Button) findViewById(R.id.button);
		textView = (TextView) findViewById(R.id.textview);
		calThread = new CalThread();
		calThread.start();
		button.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		Message msg = new Message();
		msg.what = 0x123;
		Bundle bundle = new Bundle();
		bundle.putInt(UPPER_NUM, Integer.parseInt(etNum.getText().toString()));
		msg.setData(bundle);
		calThread.mHandler.sendMessage(msg);
	}

}


activity_main.xml:



<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.primedemo.MainActivity" >

    <EditText
        android:id="@+id/etNum"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="确定" />


</LinearLayout>


Android---28---Handler、Loop、MessageQueue的工作原理:

标签:android开发   handler   looper   messagequeue   

原文地址:http://blog.csdn.net/u013476556/article/details/45200639

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!