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