我有这个:
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));
}
}
Run Code Online (Sandbox Code Playgroud)
我希望它每次都能通过循环更新文本视图,所以我会得到:1,2,3,... 99
相反,应用程序10秒内不执行任何操作,然后输出:99
我猜我需要在循环期间刷新TextView.我是Android开发的新手.有人可以告诉我,这是否是实现这一目标的最佳方式?
我最终的目标是能够处理音频样本以构建吉他调谐器.我试图直观地验证应用程序是否响应外部音频,我想更新TextView以证明这一点.请告知是否有更好的方法来做到这一点.
小智 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);
}
};}
Run Code Online (Sandbox Code Playgroud)
在mHandler.post(mUpdate)您调用的情况下mUpdate,Runnable可以在可以更新UI的其他线程中运行.在方法内部run(),不是创建一个与你的问题相同的for循环,而是使用辅助变量设置所需的文本,增加它并调用mHandler.postDelayed(this,updateTime).此时,视图会更新,并且您在屏幕上显示文本,并且在您指定的时间(以毫秒为单位)之后,将再次调用Runnable mUpdate并使用下一个数字设置文本,因此上.
我希望它有所帮助.
你最好使用一个计时器:
new Timer().schedule(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
public void run() {
debugView.setText("something");
}
});
}
}, 0, 100);
Run Code Online (Sandbox Code Playgroud)
请注意我正在使用,runOnUiThread因为您无法修改另一个不是主要线程的视图.
你的问题是你在onCreate()中运行你的循环.这是在显示Activity之前在UI线程上发生的.
看一下Android 中的Activity生命周期.它显示onCreate只是Activity创建的一个阶段.你想要做的是在后台线程上运行循环并发布通知,使用runOnUiThread将TextView更新到UI线程.克里斯蒂安的答案显示了如何做到这一点.
但是,看到你的最终目标是根据一些用户输入(在你的情况下是音频)更新TextView,你不必跳过所有这些循环来使其工作.唯一重要的是你发布你的调用来更新UI线程上的UI,否则你将获得异常.
| 归档时间: |
|
| 查看次数: |
31896 次 |
| 最近记录: |