安卓Handler消息机制

来源:互联网 发布:知乎匿名回答怎么设置 编辑:程序博客网 时间:2024/05/21 10:34

安卓Handler主要有两个作用

1.在新启动的线程中发送消息

2.在中线程中获取处理消息

在Android平台中,新启动的线程是无法访问Activity里的Widget的,当然也不能将运行状态外送出来,这就需要有Handler机制进行消息的传递了,Handler类位于android.os包下,主要的功能是完成Activity的Widget与应用程序中线程之间的交互。接下来对该类中常用的方法进行介绍,如表7-1所示。

表7-1  Handler类的常用方法

方法签名

描    述

public void handleMessage (Message msg)

子类对象通过该方法接收信息

public final boolean sendEmptyMessage (int what)

发送一个只含有what值的消息

public final boolean sendMessage (Message msg)

发送消息到Handler,

通过handleMessage方法接收

public final boolean hasMessages (int what)

监测消息队列中是否还

有what值的消息

public final boolean post (Runnable r)

将一个线程添加到消息队列

将一个线程添加到消息队列

开发带有Handler类的程序步骤如下。

在Activity或Activity的Widget中开发Handler类的对象,并重写handleMessage方法。

在新启动的线程中调用sendEmptyMessage或者sendMessage方法向Handler发送消息。

Handler类的对象用handleMessage方法接收消息,然后根据消息的不同执行不同的操作。


下面看一个周期性的改变显示图片的例子

main.xml里面的内容

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    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=".MainActivity" >


    <ImageView
        android:id="@+id/show"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:src="@drawable/ic_launcher" />


</RelativeLayout>


Activity里面的内容

package com.example.handletest;


import java.util.Timer;
import java.util.TimerTask;


import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.widget.ImageView;


public class MainActivity extends Activity {


//定义周期性显示的图片的ID
int[] imageIds = new int[]

R.drawable.image1,
R.drawable.image2,
R.drawable.image3,
R.drawable.image4,
R.drawable.image5
};
int currentImageId = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageView show = (ImageView)findViewById(R.id.show);
final Handler myHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
//如果该消息是本程序所发送的
if (msg.what == 0x1222)
{
//动态地修改所显示的图片
show.setImageResource(imageIds[currentImageId++]);
if (currentImageId >= 4)
{
currentImageId = 0; 
}
}
}
};
//定义一个计时器,让该计时器周期性地执行指定任务
new Timer().schedule(new TimerTask()
{
@Override
public void run()
{
//新启动的线程无法访问该Activity里的组件
//所以需要通过Handler发送信息
Message msg = new Message();
msg.what = 0x1222;
//发送消息
myHandler.sendMessage(msg);
}
}, 0 , 2*1000);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}


}

源码在我的资源里


原创粉丝点击