热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android28Handler、Loop、MessageQueue的工作原理:

Handler、Loop、MessageQueue的工作原理:先介绍一下这几个组件:Message:Handler接收和处理的消息对象Looper:读取MessageQueu

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 nums = new ArrayList();
						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:





    

    


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


推荐阅读
  • queue接口特点:可以模拟队列行为,即“先进先出”。接口结构queue接口继承了Collection接口,并增加了一些新方法12345678910111213141516publ ... [详细]
  • MyBatis模糊查询和多条件查询一、ISmbmsUserDao层根据姓名模糊查询publicListgetUser();多条件查询publicList ... [详细]
  • Xib九宫格应用管理使用xib封装一个自定义view的步骤1新建一个继承UIView的自定义view,假设类名叫做(AppView)2新建一个AppView.xib文件来描述 ... [详细]
  • 【自制小工具】代码生成器
    【自制小工具】代码生成器陆陆续续接触过好几款代码生成工具,发现确实好用,但都会有那么点不完善的地方,所以索性就自己做一个吧。界面非常简单,反正是自己用的,简单点用起来也方便上图:左 ... [详细]
  • 简单动态字符串redis里面很多地方都用到了字符串,我们知道redis是一个键值对存储的非关系型数据库,那么所有的key都是用字符串存储的,还有字符串类型,这些都是用字符串存储的 ... [详细]
  • packagetest;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOE ... [详细]
  • vector:在vc6中,如果要镶嵌使用vector,如vector,后面的两个应该用,空格隔开,否则被编译器认为是移位符string::npos的值为 ... [详细]
  • CentOS 7.6网卡绑定mode1
    CentOS7.6网卡绑定mode1[root@server~]#systemctlstopNetworkManager[root@server~]#systemctldisabl ... [详细]
  • 3295:[Cqoi2011]动态逆序对Description对于序列A,它的逆序对数定义为满足iAj的数对(i,j)的个数。给1到n的一个排列,按照某种顺序依次删除 ... [详细]
  • 例子如Table表有性别字段,1代表男2代表女、3代表中性、还有没填就代表未说明selectid,decode(sex,'1','男', ... [详细]
  • 接口测试的方式有很多,比如可以用工具(jmeter,postman)之类,也可以自己写代码进行接口测试,工具的使用相对来说都比较简单,重点是要搞清楚项目接口的协议是什么,然后有针对 ... [详细]
  • C#的Type对象的简单应用
    通过Type对象可以获取类中所有的公有成员直接贴代码:classMyClass{privatestringname;privateintid;publicstringcity;pu ... [详细]
  • 作业迁移
    背景:数据库服务器更换,1、数据库迁移(BACKUPRESTORE);2、数据库登录名用户迁移(注意孤立用户);3、作业迁移数据库迁移,备份数据库、拷贝备份文件到新服务器,还原数据 ... [详细]
  • Linux     系统安装
    Linux系统安装linux系统安装准备工作电脑、u盘、光盘、网络、硬盘主要使用光盘、网络虚拟化软件vmwarevi ... [详细]
  • IamusingmaterialDateTimepickerformyAndroidapp.ButIwanttocombinetheDateandTimepic ... [详细]
author-avatar
一支妙笔生花来
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有