Android:线程休眠后尝试编辑按钮文本时出错

时间:2012-10-15 15:35:04

标签: android textview android-ui

(在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循环,但我相信这个形式会把错误置于高亮之中)

1 个答案:

答案 0 :(得分: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();
}