Android应用程序,每秒生成一次随机单词并在屏幕上显示

时间:2014-02-02 14:43:26

标签: java android

如何创建一个每1秒生成一个随机单词的Android应用程序? 这是我的代码:

new Timer().scheduleAtFixedRate(new TimerTask(){
            public void run()
            {
        started = true;
        word = "";
        for (int i = 0; i < lenght+1; i++)
        {
            int j = rand.nextInt((max-min) + 1) + min;
            word += tr.Translate(j);
        }
        txt.setText(word);
            }

    }, 0, 5000);

似乎我的应用程序每次都必须更改TextView(“txt”)的文本时停止;我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

毫无疑问,在Thread内运行。这样做,它将在后台生成单词,一旦它已经有,主UI线程必须只是将内容附加到txt实例。

new Thread(
  new Runnable() { 
    public void run() {
      // your stuff
    }
  }
).start()

要将结果分配给txt对象,您可能无法在此线程中执行此操作。为此,您需要在Handler中声明Activity并在线程中使用该处理程序,因此它使用sendMessage()到主Activity,而Activity只是设置文本。

有关此herehere的更多信息。

----编辑----

正如@FD_所说,还有另一种方法可以在不使用Handler的情况下进行更新。您只需要调用runOnUiThread()方法,如下所示:

runOnUiThread(new Runnable() {
  public void run() {
    txt.setText(your_new_text);
  }
});

另一种方法是使用AsyncTask,这是(模糊地说)一个线程的“演变”,它为你提供了很多东西。更多关于AsyncTask s here

----编辑----

这将是以下方式之一:

new Thread(
  new Runnable() { 
    public void run() {
      new Timer().scheduleAtFixedRate(new TimerTask() {
        public void run()   {
          started = true;
          word = "";
          for (int i = 0; i < lenght+1; i++)
          {
            int j = rand.nextInt((max-min) + 1) + min;
            word += tr.Translate(j);
          }

          // This will update your txt instance without the need of a Handler
          runOnUiThread(new Runnable() {
            public void run() {
              txt.setText(word);
            }
          });
        }
      }, 0, 5000);
    }
  }).start();

答案 1 :(得分:0)

试试这个:

    int i = 0;

public void changeString() {
    started = true;
    word = "";

    int j = rand.nextInt((max - min) + 1) + min;
    word += tr.Translate(j);

    txt.setText(word);
    new Handler().postDelayed(new Runnable() {

        @Override
        public void run() {
            if (i < lenght + 1) {
                changeString();
                i++;
            }
        }
    }, 1000);
}

您也可以使用计时器

来完成此操作
int i=0;
new Timer().scheduleAtFixedRate(new TimerTask(){
        public void run()
        {
    started = true;
    word = "";
    int j = rand.nextInt((max-min) + 1) + min;
    word += tr.Translate(j);
    txt.setText(word);
    i++
        }

}, 0, 5000);

尝试以上方法。你犯的错误是在运行中使用for循环而不是使用循环运行方法it-self。