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

来源:互联网 发布:网络举报网站 编辑:程序博客网 时间:2024/05/17 23:09

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() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.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();}}@Overrideprotected 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);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubMessage 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>


0 0