我有这样的代码:
time = 5;
final Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
if(time == 0)
time = 0;
else {
time --;
}
handler.postDelayed(this, 1000);
}
};
我的应用程序包含一个按钮,需要收集' time'但问题是当我点击按钮时,' time'无论何时单击按钮,总是5。我测试了它并且' time'真的减少一个,但我无法获得这个价值。
我如何才能真正体验“时间”和“时间”。单击按钮后变量?
答案 0 :(得分:0)
为您的处理程序创建一个线程来处理。让线程在后台运行,但让它通过消息包将它的信息传递给你的处理程序。像这样的东西
private class HandlerThread extends Thread{
private Handler handler;
public HandlerThread(Handler uiHandler){
handler = uiHandler;
}
public void run(){
int time = 5;
Bundle b;
for(int i = 0; i < time; i++){
b = new Bundle();
b.putInt("time_key", time);
Message message = handler.obtainMessage();
message.setData(b);
handler.postDelayed(this, 1000);
handler.sendMessage(message);
}
}
}
然后让你的处理程序处理消息
final Handler handler = new Handler(){
public void handleMessage(Message msg){
Bundle b;
b = msg.getData();
mainUiTime = b.getInt("time_key",0))
}
};
你可以像这样开始你的后台线程
HandlerThread handlerThread = new HandlerThread(handler);
handlerThread.start();
作为一个注释,您还需要找到一种在线程运行完毕后取消线程的方法。这通常通过创建一个布尔变量来完成,比如keepRunning,并将它作为while循环放在run()方法中;而(keepRunning)。然后在你的mainUi中,当你没有按钮时将变量更改为false,这样它就基本上终止了线程的运行部分。