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();
}
}
};
}


更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. Android从服务器端接收json数据并解析的代码
  5. Android(安卓)ListView单选CheckBox
  6. Android(安卓)Retrofit 源码系列(四)~ 文件上传
  7. [Android面试题-3] Activity的四种加载模式
  8. Android调用接口,获取并解析数据(json格式)
  9. Android(安卓)用HttpClient 以Post方式提交数据并添加http头信息

随机推荐

  1. android 基于百度地图api获取经纬度
  2. android 零散笔记不定期更新
  3. android客户端向服务器端验证登陆方法的
  4. 三步实现Android悬浮效果
  5. [Android-Demo] Android(安卓)数据库(SQL)
  6. Android中实现整个视图切换的左右滑动效
  7. android 权限明细
  8. Android(安卓)APK应用安装原理(2)-查找AP
  9. Android长度单位详解(dp、sp、px、in、pt
  10. Android之LinearLayout(线性布局)