我有这个:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView debugView = (TextView)findViewById(R.id.debugView);
for(int i=0;i<100;i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
debugView.setText(Integer.toString(i));
}
}
我希望它每次都能通过循环更新文本视图,所以我会得到: 1,2,3,... 99
相反,该应用程序10秒内不执行任何操作,然后输出:99
我猜我需要在循环期间刷新TextView。我是Android开发的新手。有人可以告诉我,这是否是实现这一目标的最佳方式?
我最终的目标是能够处理音频样本以构建吉他调音器。我试图直观地验证应用程序是否响应外部音频,我想更新TextView以证明这一点。请告知是否有更好的方法。
答案 0 :(得分:22)
我遇到了同样的问题,我用处理程序解决了这个问题:
public class myClass extends Activity{
private Handler mHandler;
private TextView text;
private int i;
@Override
public void onCreate(Bundle savedInstanceState) {
text = (TextView) findViewById(R.id.textView01);
i = 0;
mHandler = new Handler();
mHandler.post(mUpdate);
}
private Runnable mUpdate = new Runnable() {
public void run() {
text.setText("My number: " + i);
i++;
mHandler.postDelayed(this, 1000);
}
};}
使用mHandler.post(mUpdate)
,您调用的mUpdate
是一个Runnable,它运行在可以更新UI的不同线程中。在方法run()
内,不是创建一个与你的问题相同的for循环,而是使用辅助变量设置所需的文本,递增它并调用mHandler.postDelayed(this,updateTime)
。此时,视图会更新,并且您在屏幕上显示文本,并且在您指定的时间(以毫秒为单位)之后,将再次调用Runnable mUpdate并使用下一个数字设置文本,因此上。
我希望它有所帮助。
答案 1 :(得分:8)
您最好使用计时器:
new Timer().schedule(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
public void run() {
debugView.setText("something");
}
});
}
}, 0, 100);
请注意,我正在使用runOnUiThread
,因为您无法修改另一个不是主要线程的视图。
答案 2 :(得分:6)
您的问题是您在onCreate()中运行循环。这是在显示Activity之前在UI线程上发生的。
查看Android中的Activity lifecycle。它显示onCreate只是Activity创建的一个阶段。你想要做的是在后台线程上运行循环并发布通知,使用runOnUiThread将TextView更新到UI线程。克里斯蒂安的答案显示了如何做到这一点。
然而,看到你的最终目标是根据一些用户输入(在你的情况下是音频)更新TextView,你不必跳过所有这些循环来使其工作。唯一重要的是你发布你的调用来更新UI线程上的UI,否则你将获得例外。
答案 3 :(得分:1)
而不是使用Handler,可以使用postDelayed直接传递Runnable进行查看:
public class myClass extends Activity {
private TextView text;
private int i;
@Override
public void onCreate(Bundle savedInstanceState) {
text = (TextView) findViewById(R.id.textView01);
text.postDelayed(mUpdate, 0);
}
private Runnable mUpdate = new Runnable() {
public void run() {
text.setText("My number: " + i);
i++;
text.postDelayed(this, 1000);
}
};
}