最近做APP发现settext的数值无法在UI实时更新,但是测试数值是能传到的,只是没法传输出来。查阅资料后才明白需要线程来更新。但是线程只有检测new初始化的时候才能再次运行,线程就变成了一次性更新settext了。之后有查阅资料,线程池可以解决这个问题,但是其他资料都是线程池内循环触发的,我需要的外部每次触发线程池。
最后多方资料查询及自己的调试终于做出来了,特此记录一下,给之后自己一个备份。
final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg){
super.handleMessage(msg);
if(msg.what == 1){
//这里面就用来填写输出
System.out.println("心率为:"+BIM+"/min"); //日志查看,检查错误
HeartRate.setText("心率为:"+BIM+"/min");
}
}
};
//用线程池多次执行线程,传递给handler
public void runTask() {
ExecutorService mExecutor = Executors.newSingleThreadExecutor();
if (mTaskRunnable == null) {
mTaskRunnable = new Runnable() {
@Override
public void run() {
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
};
}
mExecutor.execute(mTaskRunnable);
}
//在需要的地方调用下面的代码执行线程池
runTask();
这里不能单纯用线程池来使用settext,Android系统中的视图组件并不是线程安全的,如果要更新视图,必须在主线程中更新,不可以在子线程中执行更新的操作。
所以我们就在子线程中通知主线程,让主线程做更新操作。需要使用到Handler对象来通知主线程。
具体的相关知识点自行查询资料,这是我的大致笔记,主要是给自己记录用的。当然如果能帮忙你,那我也很高兴。