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
- Android Handler、Loop、MessageQueue的工作原理
- Android---28---Handler、Loop、MessageQueue的工作原理:
- Handler, Loop, MessageQueue的工作原理
- Handler、Loop、MessageQueue的工作原理
- Handler、Loop、MessageQueue的工作原理
- Handler、Loop、MessageQueue的工作原理<温故知新>
- Handler类和Handler,Loop,MessageQueue的工作原理
- Handler类和Handler,Loop,MessageQueue的工作原理
- 第五课:Android中Handler、Loop、MessageQueue的工作原理和使用方法
- Handler消息传递机制(二)Handler,Loop,Message,MessageQueue的工作原理
- Handler消息传递机制(二)Handler,Loop,Message,MessageQueue的工作原理
- Android中的基础----Handler、Looper、MessageQueue的工作原理
- Android Handler (Loop MessageQueue) 解析
- android基础--Handler,Loop,MessageQueue
- Handler、Looper、MessageQueue的工作原理
- Handler,Looper,MessageQueue的工作原理
- Handler,Looper, MessageQueue的工作原理解析
- Handler,MessageQueue Loop 和Message的原理解析
- LitePal vs GreenDAO vs SQLOpenHelper 性能比較
- Java第一天整理和第二天
- GDB 调试基本命令
- 并查集_HDU_1325
- 代码重构
- Android---28---Handler、Loop、MessageQueue的工作原理:
- zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h(redis)
- ORA-19808: recovery destination parameter mismatch
- android简单实现音乐播放器
- Elasticsearch之scroll
- 2015.4.20.21.03_数组_2014.4.20.21.03_ JAVA数组的定义及使用方法_0.03
- 黑马程序员——内部类
- CocoaPods安装和使用教程
- Problem 39—Integer right triangles