我试图制作一个程序,当我按下按钮时,它会显示我的arduino汽车的速度和行进的距离。我试图在TextView中不断更新距离。
这是我在onCreate()中初始化Handler,它应该将我的TextView文本设置为距离:
mHandler = new Handler() {
public void handleMessage(Message msg) {
Bundle bundle = msg.getData();
String stringss = bundle.getString("myKey");
tv2 = (TextView) findViewById(R.id.zval);
tv2.setText("Distance is : " + stringss);
}
};
这是我在后台完成工作的主题
btnDist.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Runnable runnable = new Runnable() {
public void run() {
Message msg = mHandler.obtainMessage();
Bundle bundle = new Bundle();
int distance = distanta(); //function that returns distance/secound
int dist = 0;
while(distance > 0) {
try {
Thread.sleep(1000); //1000 milliseconds is one second.
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
dist += distance;
}
String dateString = String.valueOf(dist);
msg(dateString);
bundle.putString("myKey", dateString);
msg.setData(bundle);
mHandler.sendMessage(msg);
}
};
Thread mythread = new Thread(runnable);
mythread.start();
}
});
应用程序运行并且不会崩溃,但我的textview根本没有更新。 我是java线程的新手,所以我可能做错了什么。谢谢!
答案 0 :(得分:0)
试试这个以找到arduino旅行的时间:
TextView TimerBox;
long startTime = 0;
Handler timerHandler = new Handler();
//this updates the textbox
Runnable timerRunnable = new Runnable() {
@Override
public void run() {
long millis = System.currentTimeMillis() - startTime;
int seconds = (int) (millis / 1000);
int decis = (int) ((millis % 1000)/10);
TimerBox.setText(String.format("Time: %d.%02d", seconds, decis));
timerHandler.postDelayed(this, 10);
}
};
这会初始化一个具有特定功能的新处理程序,该功能将更新计时器textview。
如果您希望它运行,请编码:
startTime = System.currentTimeMillis();
timerHandler.postDelayed(timerRunnable, 0);
当你希望它停止时,请使用:
timerHandler.removeCallbacks(timerRunnable);
此解决方案将要求您根据速度和加速度计算自己行进的距离。
答案 1 :(得分:0)
它不起作用的原因是因为Handler
在默认情况下创建它的线程上运行消息处理程序。在您的示例中,这是线程mythread
。这意味着您正在尝试从与通常不起作用的UI线程不同的线程更新UI。
可以通过指定处理程序应运行的Looper
来修复它,例如mHandler = new Handler(Looper.getMainLooper()) {
答案 2 :(得分:0)
if(seconds == 2){
seconds = 0;
decis = 0;
}
我不能评论Chi-Young Jeffrey Lii的答案,因为我的代表还不够,我只是想知道如何阅读秒变量