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();
}
});
}
}
程序运行效果如下:
- Android学习07Android应用程序的内部通信
- android应用程序内部通信
- Android学习08Android应用程序组件之间的通信Intent和IntentFilter
- Android应用程序的内部付费机制(转)
- 调用android系统内部的安装apk应用界面进行安装应用程序,例如需要更新应用程序
- Android从驱动层到应用程序层的通信
- Android从驱动层到应用程序层的通信
- Android从驱动层到应用程序层的通信
- Android软件开发之应用程序之间的通信介绍
- Android 应用程序建立与WMS服务之间的通信过程
- Linux下应用程序开发:QT的内部进程通信
- Linux下应用程序开发:QT的内部进程通信
- Android学习-应用程序管理
- Android学习-应用程序管理
- Android应用程序的Activity启动过程、Android应用程序启动过程源代码分析、Android应用程序内部启动Activity过程(startActivity)的源代码分析
- 如何学习Android应用程序的开发
- 如何学习Android应用程序的开发
- android应用程序的发布学习(二)
- 从Dump中获取DDL语句
- Android给View画边框
- 【POJ1887 || 2355 || 1631】Testing the CATCHER(最长递增(递减)子序列)NYOJ224
- 高性能NOSQL数据库redis结合谷歌开源tcmalloc库的安装笔记
- IIS6中添加对OFFICE 2007文档格式 .docx .xlsx .pptx等的支持
- Android学习07Android应用程序的内部通信
- 让CPU占用率画出正弦曲线
- 1276
- kernel-panic问题
- 关于不带www的域名
- 构造函数应该注意的地方
- Adobe Flash 基本原理
- MyEclipse6.5_org.tigris.subversion.javahl.ClientException: Unsupported working copy format问题解决方法
- ubuntu下创建图标