我尝试使用线程,但android抛出“CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图。”。
那么我怎么能等待3秒然后隐藏视图,让GUI响应?
-
Timer也使用另一个线程,所以它不会解决..
答案 0 :(得分:51)
有一种更简单的方法:使用View.postDelayed(runnable, delay)
View view = yourView;
view.postDelayed(new Runnable() {
public void run() {
view.setVisibility(View.GONE);
}
}, 3000);
它不是很精确:可能会隐藏在3.5或3.2秒内,因为它会发布到ui线程的消息队列中。
使用post()或runOnUiThread()就像setTimeout()一样。
答案 1 :(得分:17)
生成一个休眠3秒钟的单独线程,然后调用runOnUiThread
隐藏视图。
Thread thread = new Thread() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
}
runOnUiThread(new Runnable() {
@Override
public void run() {
// Do some stuff
}
});
}
};
thread.start(); //start the thread
答案 2 :(得分:17)
无需引用视图或睡眠线程:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// do stuff
}
}, 3000);
答案 3 :(得分:0)
我知道这很麻烦,但是如果您恰巧使用了协程,这是一个答案:
lifecycleScope.launch {
delay(3000)
header.visibility = View.GONE
}
答案 4 :(得分:0)
您可以显示您的视图,然后以这种方式隐藏它。
View view = yourView;
view.setVisibility(View.VISIBLE);
new Handler().postDelayed(() -> view.setVisibility(View.GONE), 3000);