如何在Android中循环时刷新TextView?

cha*_*imp 7 android textview

我有这个:

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并使用下一个数字设置文本,因此上.

我希望它有所帮助.


Cri*_*ian 8

你最好使用一个计时器:

    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因为您无法修改另一个不是主要线程的视图.


phe*_*cks 6

你的问题是你在onCreate()中运行你的循环.这是在显示Activity之前在UI线程上发生的.

看一下Android 中的Activity生命周期.它显示onCreate只是Activity创建的一个阶段.你想要做的是在后台线程上运行循环并发布通知,使用runOnUiThread将TextView更新到UI线程.克里斯蒂安的答案显示了如何做到这一点.

但是,看到你的最终目标是根据一些用户输入(在你的情况下是音频)更新TextView,你不必跳过所有这些循环来使其工作.唯一重要的是你发布你的调用来更新UI线程上的UI,否则你将获得异常.