2

我有一个 Android 应用程序,按下按钮后会启动一个功能(在 onCreate() 之外)。此函数使用for循环更改全局字符串变量5 次。我想查看屏幕上显示的每个变量(即在 TextView 中)。我知道我必须使用RunnableHandler,但是..

MainActivity(扩展 Activity)/ onCreate()中:

button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View arg0) {
        handler.post(timedTask);
        Start();
    }
});

Start()运行,但屏幕上没有任何内容,直到它完成

MainActivity(扩展 Activity)中:

private Runnable timedTask = new Runnable()
{
      @Override
      public void run()
      {
          textView1 = (TextView) findViewById(R.id.textView1);
          textView1.append(globalMessage);
          handler.postDelayed(this, 100);
      }};

MainActivity(扩展 Activity)/Start() 中:

for(int j = 0; j < 5; j++)
{
    ...
    globalMessage = message[j];
    ...
}
4

2 回答 2

2

首先,您正在从不同的线程访问变量。您应该将其声明为volatile.

所以你想让你timedTask显示 5 个 globalMessage 值?

确保将 timedTask 与循环同步,以便在每次修改 timedTask 后执行。

for(int j = 0; j < 5; j++)
{
    ...
    globalMessage = message[j];
    ...// wait sometime here or make sure it is a long operation that is enough for synchronization
}

编辑

handler.post可能不会立即开始运行。您可以自己启动 runnable:

(new Thread(timedTask)).start(); // instead of handler.post

或者做最简单的方法:只需在同一线程中更新 for 循环中的文本。

于 2013-07-06T10:53:14.847 回答
0

我知道了!诀窍是方法/函数中的所有代码放入 Runnable,然后一切正常,每个文本都在现场更新。所以这段代码:

private Runnable timedTask = new Runnable()
{
      @Override
      public void run()
      {
          textView1 = (TextView) findViewById(R.id.textView1);
          textView1.append(globalMessage);
          handler.postDelayed(this, 100);
      }};

变成:

private Runnable timedTask = new Runnable()
{
    @Override
    public void run()
    {
        textView1 = (TextView) findViewById(R.id.textView1);
        for(int j = 0; j < 5; j++)
        {
        ...
        globalMessage = message[j];
        textView1.setText(globalMessage);
        ...
        }
    }
};

不过,我改变了一些事情:

  1. 多亏了Tala,我handler.post(timedTask);Thread thread1 = new Thread(timedTask1);然后thread1.start();或简单地用一行进行了更改(new Thread(timedTask)).start();

  2. 我遇到了一些例外情况:

android.view.ViewRoot$ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能接触其视图。

这可以通过textView1.setText(globalMessage);并且textView1.append(globalMessage);肯定有更多这种类型的方法来实现,而这些方法不在 onCreate()中。如果您想在 onCreate 之外使用它们,请阅读答案,该答案建议将该行替换为:

runOnUiThread(new Runnable() {
    @Override
    public void run()
    {
        button1.append(globalMessage);
    }
});

您应该注意的另一个例外是 java.lang。NullPointerException这意味着您应该在当前方法/可运行/范围内初始化一些变量

如果有人有问题:请随时在此处发表评论!

于 2013-07-06T16:58:43.813 回答