Android学习07Android应用程序的内部通信

来源:互联网 发布:js 时间戳转换日期nan 编辑:程序博客网 时间:2024/06/05 21:10

   在Android应用程序运行时,默认情况下会为第一个启动的组件创建一个进程,之后启动的组件都运行在这个进程中。

   当为应用程序创建了一个进程后,一个主线程将会被创建。这个主线程主要负责维护组件对象和应用程序创建的所有窗口,如果应用程序中创建了自己的线程,这些线程将无法对主线程控制的内容进行修改,此时就需要使用Handler来同主线程进行交互,下面就简单介绍Handler类已经基本的用法。

 

    Handler类主要用于应用程序的主线程同用户自己创建的线程进行通信,应用程序在主线程中维护一个消息队列。Handler机制使得线程间的通信通过Message和Runnable对象来传递和处理。

    每个Handler对象都与一个线程及其消息队列相关联。当创建一个Handler对象时,其便与创建这个Handler对象的线程的消息队列绑定,之后该Handler对象将会向消息队列传递message或runnable并处理执行队列中的元素。

   Handler最主要的用法就是安排Message和Runnable对象使其在未来的某个时刻被处理或运行

 

   1. 传递消息对象

       使用Handler传递消息时将消息内容封装到一个Message对象中,Message类中包含了消息的描述和任何形式的可以被Handler发送的数据对象。一个Message对象中主要的字段如下:

    字段                                                                说明

    arg1                       int类型,当传递的消息只包含整数时,可以填充该字段以降低成本,该字段可以通过

    arg2                           成员方法setData和getData方法访问或修改

    obj                                       Object类型,可以为任意类型

    what                int类型,由用户定义的消息类型代码,接收方可以根据该字段值来确定收到的消息是关于什么的

 

   注意,getData和setData返回和接收的都是Bundle对象,该对象是以String为键,以任意可封装的类型为值的map.

 

    Handler类发出消息时,既可以指定消息到达后立即被处理,也可以指定其经过特定的时间间隔后被处理,还可以指定一个绝对时间让消息在那之前被处理,不同的方法如下:

 

            方法名                                                                      说明

sendEmptyMessage(int what)                发送一个空白的消息,只指定Message的what字段

sendMessage(Message message)                      发送一个消息对象

sendMessageAtTime(Message message,long time)             在指定时间之前发送一个消息

sendMessageDelayed(Message message,long time)      在指定时间之后发送一个消息

 

   无论以何种形式发出,接收处理消息的方法都是handleMessage方法,该方法接收的参数为一个Message对象,在期中可以根据程序的需要对不同的消息进行不同的处理。。(虽然Message类提供了共公有的构造方法,但是最好 的获得一个Message对象的途经是调用Message类的静态方法obtain或者是Handler类的一系列方法,如obtainMessage,这样创建的Message对象是可复用的)

 

     2.传递Runnable对象

        传递Runnable对象与传递message对象类似,Runnable对象为实现了Runnable接口的对象,Handler在传递Runnable对象时也可以设置其经过指定的时间间隔或在指定的绝对时间之前被处理

 

下面是Handler进行内部通信的小例子

 

献世4在布局文件中main.xml添加一个控件和一个TextView如下:

<?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"
    >
   
<Button
      android:id = "@+id/button"
      android:layout_width = "fill_parent"
      android:layout_height = "wrap_content"
      android:text = "点击开始更新来自线程的数据"
/>           <!-- 添加一个Button控件 -->

<TextView 
    android:id="@+id/textView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="数据未更新"
    />
</LinearLayout>

下面是Activity的代码:

package karant.zhan;

import android.R.integer;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class HandlerTest extends Activity{
   
 public static final int UPDATE_DATA = 0;     //常量,代表更新数据
 public static final int UPDATE_COMPLETED = 1;   //常量, 代表更新数据
 TextView textView;            //TextView对象的引用
 Button button;                //Button对象的引用
 
 Handler myHandler = new Handler(){

  @Override
  public void handleMessage(Message msg) {      //重写处理消息方法
   switch(msg.what){         //判断消息类别
   case UPDATE_DATA:
    textView.setText("正在更新来自线程的数据:"+ msg.arg1 + "%...");      //更新TextView显示的内容
    break;
    case UPDATE_COMPLETED:
     textView.setText("已经完成来自线程的更新数据!");              //改变TextView显示的内容
   }
  }
  
 };
 
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textView = (TextView)findViewById(R.id.textView);
        button  = (Button)findViewById(R.id.button);
       
        //下面 为按键提供事件监听
        button.setOnClickListener(new View.OnClickListener() {    
   
         
   @Override
   public void onClick(View v) {    
    new Thread(){                        //启动一个新线程
     public void run() {
      for(int i = 1; i<100 ; i++){                
       try{                              //睡眠150毫秒
        Thread.sleep(150);
       }catch (Exception e) {
        e.printStackTrace();
       }
       Message message = myHandler.obtainMessage();   //创建Message对象
       message.what = UPDATE_DATA;                     //为what赋值
       message.arg1 = i + 1;                          //为arg1字段赋值
       myHandler.sendMessage(message);               //发出Message对象
      }
      myHandler.sendEmptyMessage(UPDATE_COMPLETED);      //发更新完毕消息
     }
     
     
    }.start();
    
   }
         
        });
    }
}

 

程序运行效果如下:

 

 

 

     

原创粉丝点击