标签: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