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

时间:2010-12-13 03:46:21

标签: 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));
    }

}

我希望它每次都能通过循环更新文本视图,所以我会得到: 1,2,3,... 99

相反,该应用程序10秒内不执行任何操作,然后输出:99

我猜我需要在循环期间刷新TextView。我是Android开发的新手。有人可以告诉我,这是否是实现这一目标的最佳方式?

我最终的目标是能够处理音频样本以构建吉他调音器。我试图直观地验证应用程序是否响应外部音频,我想更新TextView以证明这一点。请告知是否有更好的方法。

4 个答案:

答案 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);

        }
    };
}