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