您的位置:首页 > 移动开发 > Android开发

Android Handler类消息传递机制(三)不同类中使用Handler

2014-03-05 10:00 465 查看
Handler的关键,在不同类中使用需要注意参数的传递 分为两种情况

1.从其他类向activity类传送数据

下面以其他类和activity类通信交换数据为例讲解运行模式

/**********************************************************************************************************************************

*下面是发送类中关于handler的代码

*/

//构造函数带了参数,是因为不同类间传递参数,将接受方的handler实例传递过来

@SuppressLint("HandlerLeak")

public Jiasudu(Handler handler_zjk) {

handler2=handler_zjk;//实际上handler2就是接收方的实例了,巧妙的转换方法实现不同类间handler传递数据

handler = new Handler(){

public void handleMessage(Message msg) {

if(msg.what==200)//这是接收本类中定时器发送过来的信号用来更新正方体

updateXYZ();

}

};

//定时器任务中发送了两个信号,给本类中发送了一个,给activity类中发了一个

task = new TimerTask(){

public void run() {

String[] xyz = new String[3];//发送给activity用的

//2s生成xyz的随机数

x=(float) (Math.random()*(-2)+1);

y=(float) (Math.random()*(-2)+1);

z=(float) (Math.random()*(-2)+1);

Message msg = new Message();

msg.what=200;//这是发送给当前类中用来更新立方体的

handler.sendEmptyMessage(msg.what);

msg.what=0x123;//这是发送给activity类中用来更新文本框中XYZ值得

Bundle bundle = new Bundle();//对数据包装后用MSG发送

//要发送的是一个字符串数组,第一个参数是指定数据的名,当接收数据时可以用这个名来选择获取哪个数据,很方便,第二个参数是发送的数组

bundle.putStringArray("xyz", xyz);

msg.setData(bundle);

handler2.sendMessage(msg);//handler2指的是接收处的Handler实例,这里因为不是同一类,所以要用构造函数将接受类的handler实例传递过来

}

};

timer.schedule(task, 0, 7000);

}

/**********************************************************************************************************************************

*下面是接收类activity中关于handler的代码

*/

/******************************************************************

* 注意:次Handler实体要在语句DrawLine myRender = new DrawLine(drawlineHandler);

* 的上面

* zjk2014/03/04注

*/

drawlineHandler = new Handler()

{

public void handleMessage(Message msg)

{

if(msg.what==0x123){

String[] xyz=new String[3];
//参数xyz是发送方bundle.putStringArray("xyz", xyz);bundle.putStringArray("xyz", xyz);第一个参数对应,表示要取出的是哪个数据

xyz=msg.getData().getStringArray("xyz");

X.setText(xyz[0]);

Y.setText(xyz[1]);

Z.setText(xyz[2]);

}

}

};

关于bundle的讲解请看下篇

2.从activity向其他类传送

从activity向其他类传送相对要容易点,请看下面例子

/**********************************************************************************************************************************

*下面是发送类activity的代码

*/

/******************************************************************

// 创建GLSurfaceView的内容绘制器 因为在定时器中发送handler时用到,所以全局了

DrawLine myRender = new DrawLine();//实例化:注意这个地方是没用到XML所以直接用的纯.java代码的实例化方式

,当使用到XML文件时实例化要用findviewbyid

//发送给drawline类用来动态更新三维图的放在了定时器中

task = new TimerTask()

{

public void run()

{

acc_status= (TextView) findViewById(R.id.acc_status);

//获取三个数据,XYZ分别对应value1 values value3 取值在0-1之间,注意数值范围的处理

// 2s生成xyz的随机数

x = (float) (Math.random() * (-3) + 1.2);

y = (float) (Math.random() * (-3) + 1.2);

z = (float) (Math.random() * (-3) + 1.2);

//发送给本文件中的Nodecontrol_accActivity类用来动态更新数值的

Message msg1 = new Message();

msg1.what = 0x123;

Bundle bundle = new Bundle();

bundle.putFloat("x", x);

bundle.putFloat("y", y);

bundle.putFloat("z", z);

bundle.putInt("status",status);

msg1.setData(bundle);

drawlineHandler.sendMessage(msg1);

//发送给drawline类用来动态更新三维图的

Message msg = new Message();

msg.what = 200;

Bundle bundle1 = new Bundle();

bundle1.putFloat("x", x);

bundle1.putFloat("y", y);

bundle1.putFloat("z", z);

msg.setData(bundle1);

myRender.handler.sendMessage(msg);//直接类的实例时调用就OK,无需通过构造函数之类的传 递变量那么麻烦,注意:只有一个handler的前提下(多个的时候是否myRender.handler1这样调用另一个名字的handler就好呢,未测试)

}

};

timer.schedule(task, 0, 7000);

/**********************************************************************************************************************************
*下面是接受类(其他类)的代码
*/
/******************************************************************

public DrawLine()//此为构造函数

{

handler = new Handler()

{

public void handleMessage(Message msg)

{

if (msg.what == 200)

{

x = msg.getData().getFloat("x");

y = msg.getData().getFloat("y");

z = msg.getData().getFloat("z");

updateXYZ();

}

}

};

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: