【问题标题】:TextView will not update from a loop in AndroidTextView 不会从 Android 中的循环中更新
【发布时间】:2014-10-28 06:20:50
【问题描述】:

我有一个简单的应用程序,当我单击按钮时,它会根据循环中生成的值更新TextView

但是当我运行应用程序时,它只显示TextView 中的最后一个数字。我添加了一个Thread.sleep() 来减慢循环速度,但它不起作用,仍然是相同的结果。我在这里做错了什么?提前感谢

public class MainThread extends ActionBarActivity {
    Button btnShow;
    TextView txtSee;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_thread);

        btnShow = (Button) findViewById(R.id.btnShow);
        txtSee = (TextView) findViewById(R.id.txtSee);

        btnShow.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                try {
                    for (int i = 0; i <= 5; i++) {

                        String text1 = "Iteration No " + i + " occured";
                        txtSee.setText(text1);
                        Thread.sleep(2000);
                    }

                } catch (InterruptedException e) {
                }
            }
        });
    }

    ....
}

【问题讨论】:

  • onClick 在 UI 线程中被调用。您应该从不在 UI 线程中调用 Thread.sleep()

标签: java android multithreading loops textview


【解决方案1】:

使用

 txtSee.append(text1);

而不是

 txtSee.setText(text1);

您的循环执行速度太快,无法让您观察到变化

【讨论】:

  • 不起作用,所有附加的文本都显示在循环的末尾。
  • 这是因为你的线程休眠了 2 秒,在这之间循环执行
【解决方案2】:

在循环中调用另一个函数并使用 txtSee.setText(text1); 在那个函数里面。

               or (int i = 0; i <= 5; i++) {

                            String text1 = "Iteration No " + i + " occured";
                            call_function(text1,txtSee);

                        }

call_function:-

call_function(String text1,TextView txtSee;){
                      txtSee.setText(text1);
                        Thread.sleep(2000);
                       }

【讨论】:

  • 我不明白为什么 OP 需要在这样的子例程中移动代码来解决他的问题。尽管这可能是一个很好的做法,但不应将其作为解决方案的一部分。此外,您在子例程中调用 setText() 而不是您正在谈论的 append 方法。
  • @Joffrey,因为append 是在不删除前一个的情况下添加即将到来的内容的方法,在这里他只需要显示文本 2 秒。这就是我使用它的原因。
  • 我没有说append() 是正确的做法,但那是你在介绍文本中所说的,你没有在代码中这样做。
  • @Joffrey,谢谢兄弟指出这个。我没看到。我的错。现在我已经编辑了我的答案..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多