歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android消息處理機制

下面和大家分享一下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