歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android消息處理機制

Android消息處理機制

日期:2017/3/1 10:46:03   编辑:Linux編程

下面和大家分享一下Android中非常重要的消息處理機制,說到消息處理,Message,MessageQueue,Looper,Handler這四個類的作用是我們必須要明白的。

下面分別談談他們的作用:

MessageQueue

MessageQueue表示消息隊列,存放消息的地方,按照“先進先出”的規則執行,每一個線程只可以擁有一個MessageQueue。當創建Looper對象的時候會創建一個MessageQueue對象。

Message

Message表示消息對象,MessageQueue中存放的對象,一個MessageQueue中可以存放多個Message對象。通過調用Message類的obtain()方法或者調用Handler類的obtainMessage()方法獲取Message對象,但是這樣並不一定會創建一個新的Message對象,如果消息池中有可用的Message對象則直接取出返回這個對象,否則如果消息池中沒有可用的Message對象,則會創建一個新的Message對象。當消息隊列中的Message對象被系統處理完之後,該Message對象會從MessageQueue中刪除,然後放入消息池中。

Looper

Looper是用來操作MessageQueue的,每一個Looper對應一個MessageQueue,可以通過調用Looper.myLooper()方法獲取當前線程的Looper對象,Looper循環從MessageQueue中取出Message對象,交給Handler調用handleMessage方法進行處理,處理完之後Message對象被放入消息池中。

Handler

Handler是消息的處理者,Handler將需要傳遞的信息封裝成Message對象,然後調用sendMessage方法將Message放入MessageQueue中,當MessageQueue循環到該Message時,調用相應Handler對象的handleMessage方法對其進行處理。

注意在UI線程也就是主線程中默認會創建Looper對象和MessageQueue對象,如果在我們自己新開的線程中要進行消息處理,必須創建Looper對象和MessageQueue對象,通過調用Looper.prepare()方法可以創建Looper對象和MessageQueue對象,調用Looper.loop()方法可以啟動消息循環隊列。

下面和大家分享一個實例:

MainActivity.java代碼

package com.zyb.message;

import java.util.Random;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.widget.TextView;

public class MainActivity extends Activity {
//顯示消息內容
private TextView show;
//程序是否退出
private boolean isExit=false;
//消息處理者
private Handler handler=new Handler(){

@Override
public void handleMessage(Message msg) {
if(msg.what==1){
//獲取消息內容
Object content=msg.obj;
show.setText(""+content);
}
super.handleMessage(msg);
}

};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
show=(TextView)findViewById(R.id.show);
//啟動線程
new Thread(new SubThread()).start();
}

@Override
protected void onDestroy() {
isExit=true;
super.onDestroy();
}

private class SubThread implements Runnable{

@Override
public void run() {
//創建Looper對象
Looper.prepare();
while(!isExit){
//獲取消息
Message msg=handler.obtainMessage();
//消息的標識
msg.what=1;
//消息的內容,一個1000以內的隨機數
msg.obj=new Random().nextInt(1000);
//發送消息
handler.sendMessage(msg);
//每隔一秒鐘發送一次消息
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//啟動消息循環隊列
Looper.loop();
}

}
}

main.xml代碼

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/show"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
/>
</LinearLayout>

程序運行結果是屏幕上每隔一秒鐘顯示一個1000以內的隨機數。

Copyright © Linux教程網 All Rights Reserved