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=""
    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>

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyfgjw.html