我想每秒更新一次textview。 点击按钮我正在调用一种方法,
loopMethod(milli); //suppose milli= 50000 i.e 50 sec.
所以我的loopMethod(int m)
如下:
public void loopMethod(int m){
timer=(TextView) findViewById(R.id.timerText);
if(m>=1000){
try {
timer.setText(""+m);//timer is a textview
System.out.println(m);
m=m-1000;
Thread.sleep(1000);
} catch(InterruptedException ex) {
ex.printStackTrace();
}
loopMethod(m);
}
}
所以我期待的是,我的计时器textview
应该每秒打印m
的值。
但我只得到控制台输出,即system.out.println(m)
...
控制台上的打印价值正常......
但它根本没有更新我的textview
答案 0 :(得分:11)
您可以使用以下代码:
Runnable updater;
void updateTime(final String timeString) {
timer=(TextView) findViewById(R.id.timerText);
final Handler timerHandler = new Handler();
updater = new Runnable() {
@Override
public void run() {
timer.setText(timeString);
timerHandler.postDelayed(updater,1000);
}
};
timerHandler.post(updater);
}
在这一行:
timerHandler.post(updater);
时间将首次设定。即updater将执行。首次执行后,它将在每1秒的时间间隔后发布。它会每隔一秒更新一次TextView。
当活动破坏时你需要删除它,否则它会泄漏内存。
@Override
protected void onDestroy() {
super.onDestroy();
timerHandler.removeCallbacks(updater);
}
希望它会对你有所帮助。
答案 1 :(得分:2)
您应该使用RxJava库来执行此操作:
Subscription s =
Observable.interval(1, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(v -> {
// update your ui here
}, e -> {
});
// call when you no longer need an update:
if (s != null && !s.isUnsubscribed()){
s.unsubscribe();
s = null;
}
就是这样。不要使用.postDelay(),Timer,因为它容易出错。
答案 2 :(得分:1)
您可能需要考虑使用Chronometer类:https://developer.android.com/reference/android/widget/Chronometer.html
只需点击按钮
即可使用timer.start();
答案 3 :(得分:0)
我添加了一些逻辑来停止Timer。如果您有任何问题,请自由询问
private int m = 0;
private int milliseconds = 1000;
public void loopMethod(int m){
timer=(TextView) findViewById(R.id.timerText);
Timer t = new Timer();
//schedule a timer
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
timer.setText(String.valueOf(m));//avoid using composite string in the setText
System.out.println(String.valueOf(m));
//remove from the total the amount of millisecond passed
m=m-milliseconds;
if(m <= milliseconds) { //or <= what you want
//stop the timer repeatitions
t.cancel();
}
}
});
}
//"0" is the amount of time to wait for the timer to start
//"milliseconds" is the duration
},0,milliseconds);
}
添加强>
要进行正确的分析,您应该在问题中添加更多信息。不更新textview
的问题可能是由setText("" + int)
引起的,因为使用int避免使用setText
总是更好。我使用String.valueOf
对其进行了编辑,但是如果它不起作用,则应添加xml
和onCreate
希望这有帮助
答案 4 :(得分:0)
使用处理程序可以像这样使用
TextView timer;
int m =0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timer=(TextView) findViewById(R.id.timerText);
Handler handler = new UpdateHandler();
m = 10;
handler.sendEmptyMessageDelayed(1, 1000);//start after 1000
}
class UpdateHandler extends Handler{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
timer=(TextView) findViewById(R.id.timerText);
timer.setText("Text :" +m);
m = m-1000;
sendEmptyMessageDelayed(1, 1000); //seng again after 1000
//add some stop logic
break;
default:
break;
}
}
}
答案 5 :(得分:0)
尝试此代码在
中初始化textviewonCreate
timer=(TextView) findViewById(R.id.timerText);
public void loopMethod(int m){
if(m>=1000){
try {
System.out.println(m);
m=m-1000;
final ScheduledThreadPoolExecutor c = new ScheduledThreadPoolExecutor(1);
c.schedule(new Runnable() {
@Override
public void run() {
timer.setText(""+m);//timer is a textview
c.shutdownNow();
}
}, 1, TimeUnit.SECONDS);
} catch(InterruptedException ex) {
ex.printStackTrace();
}
loopMethod(m);
}
}