TimerTask()中调用TextView.setText报错原因(非UI线程中 不能访问UI组件)

TimerTask()中调用TextView.setText报错原因

天写了个程序子模块大体意思是在定时器中产生数据赋给TextView显示,结果程序在调用TextView.setText()时便会报错,程序停止运行

程序如下

task = new TimerTask()
{

public void run()
{
acc_status= (TextView) findViewById(R.id.acc_status);


//获取三个数据,XYZ分别对应value1 values value3 取值在0-1之间,注意数值范围的处理
// 2s从数据库中提取数据
tb_nodeValue=nodeValueDAO.find(PubilcDefine.ACC);
int status=tb_nodeValue.getstatus();
if(status==1)
{
x= tb_nodeValue.getValue1();
y= tb_nodeValue.getValue2();
z= tb_nodeValue.getValue3();
acc_status.setText("在线");
}
else 
{
x=0f;
y=0f;
z=0f;

acc_status.setText("离线");
}

X.setText(String.valueOf(x));
Y.setText(String.valueOf(y));
Z.setText(String.valueOf(z));
Log.i("zjk3", "123456");
//发送给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);
}
};
timer.schedule(task, 0, 7000);

程序第一次调用定时器运行时良好,但是当第二次运行到acc_status.setText("离线");(第一次调用setText()函数时)便会停止运行

原因是:非UI线程中 不能访问UI组件,但是为什么第一次调用的时候良好而且也能显示离线,第二次就不行呢,没弄懂,随后就干脆不在定时器中显示了(因为定时器默认是开辟了个新线程)

修改如下

//就是因为非UI线程中不能显示UI组件,所以在定时器中获取的数据没有直接的赋给UI显示而是将其通过Handler传过来
drawlineHandler = new Handler()
{
public void handleMessage(Message msg)
{
if (msg.what == 0x123)
{
x = msg.getData().getFloat("x");
y = msg.getData().getFloat("y");
z = msg.getData().getFloat("z");
int status = msg.getData().getInt("status");
if(status==1)
acc_status.setText("在线");
else
acc_status.setText("离线");
X.setText(String.valueOf(x));
Y.setText(String.valueOf(y));
Z.setText(String.valueOf(z));


}
}
};
task = new TimerTask()
{

public void run()
{
acc_status= (TextView) findViewById(R.id.acc_status);

//String[] xyz = new String[3];
//获取三个数据,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);
tb_nodeValue=nodeValueDAO.find(PubilcDefine.ACC);
int status=tb_nodeValue.getstatus();
if(status==1)
{
x= tb_nodeValue.getValue1();
y= tb_nodeValue.getValue2();
z= tb_nodeValue.getValue3();
//acc_status.setText("在线");//非UI线程不能调用UI组件,所以不能在这里显示
}
else 
{
x=0f;
y=0f;
z=0f;
Log.i("zjk1", "123456");
//acc_status.setText("离线");
}

//发送给本文件中的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);
}
};
timer.schedule(task, 0, 7000);

总结:就是感觉在同一文件中生成的随机数为什么还要通过handler传递才显示,干脆直接显示多好才造成了此错误

疑点:为什么在定时器中直接显示的时候第一次调用是可以的,第二次调用才停止运行,还未解决

你可能感兴趣的:(android)