-1

(在 Eclipse 中编程 Android) 我正在尝试设置延迟更改按钮中的文本。只有在延迟并且需要更改文本后,我才会收到错误。这是没有while循环的简化代码:

final Button button_target = (Button) findViewById(R.id.button_target);        
    Thread textChange = new Thread(new Runnable() { 
        public void run(){
            button_target.setText("fog");
            try{
                Thread.sleep(3000);
            }catch(InterruptedException e){}                
        }
    });
    textChange.start();

现在这里是在睡眠需要更改按钮上的文本的代码,这会导致错误并退出(强制):

 final Button button_target = (Button) findViewById(R.id.button_target);        
    Thread textChange = new Thread(new Runnable() { 
        public void run(){
            button_target.setText("cat");
            try{
                Thread.sleep(3000);
            }catch(InterruptedException e){}                
            button_target.setText("dog");
        }
    });
    textChange.start();

我在做什么导致错误?我应该采取另一种方法来调用线程的睡眠或延迟,以便可以执行文本更改操作?

(实际代码有一个while循环,但我相信这种形式会突出显示错误)

4

1 回答 1

2

您不能在 setText() 之类的线程上更改 UI 内容,必须在 UIThread 上完成。有关更多信息,请参见 AsyncTask:

http://developer.android.com/reference/android/os/AsyncTask.html

添加更多信息

您可以将 THREAD_POOL_EXECUTOR 与 AsyncTask 一起使用,以了解您使用的 Android 版本,如下所示:

AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {

    @Override
    protected Void doInBackground(Void... voids) {

        try{
            Thread.sleep(3000);
            }catch(InterruptedException e){} 
        }
    }

    @Override
    protected void onPostExecute(Void result) {
        button_target.setText("dog");
    }

};

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
    task.execute();
}
于 2012-10-15T15:37:54.583 回答