我试图创建一个从5到1计数的简单计数器,并在每秒后更新视图。我已经尝试在没有处理程序的情况下进行,只需要一个简单的循环,但它只是在等待或强制关闭后向我显示1。我也试过弄乱runOnUIThread
和线程,但我错过了一些东西。
这是我的代码:
package com.ammad.test;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.support.v4.app.NavUtils;
public class Main extends Activity {
TextView tv;
Button b1;
Handler mHandler;
int i = 5;
private Runnable runnable;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tvShow);
b1 = (Button) findViewById(R.id.bt1);
runnable = new Runnable() {
public void run() {
// do your stuff - don't create a new runnable here!
tv.setText(String.valueOf(i));
i--;
mHandler.postDelayed(runnable, 500);
}
};
b1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
mHandler.post(runnable);
mHandler.removeCallbacks(runnable);
}
});
}
public void doTheLoop() {
/*
* runOnUiThread(new Runnable() {
*
* public void run() { for (int i = 5; i >= 1; i--) { // TODO
* Auto-generated method stub tv.setText(Integer.toString(i)); for (int
* j = 0; j < 200000; j++) ; } }
* `enter code here`
* });
*/
// mHandler.post(runnable);
}
}
答案 0 :(得分:0)
你在哪里实例化mHandler
?我认为代码丢失了,否则这会因NullPointerException而失败。这很重要,因为如果你只是在onCreate
中使用no-arg构造函数实例化它,它将使用UI线程的消息队列。
但是还有其他问题:在Runnable.run
方法中,您实际上并未检查i
是否小于零,因此它始终会自行调用postDelayed
。此外,您正在从非UI线程更新UI(setText
),这可能会导致未定义的行为。
我认为你的代码比它需要的复杂一点。如果这个例子被愚蠢地隐藏起来并且隐藏了你的实际意图,这个例子可能太简单了,但是这里的内容基本上是可行的,虽然你需要编辑它一点来编译(捕获InterruptedException等)
new Thread() {
public void run() {
while(i > 0) {
Thread.sleep(1000);
mTextView.post(new Runnable() {
public void run() {
mTextView.setText(Integer.toString(i--));
}
});
}
}
}.start();