今天有一个需求,就是要实现一个阻塞式的输入对话框,在对话框显示后,UI进程阻塞,随后在输入对话框点击确定后,返回输入的内容,然后继续UI进程。

本来我是试着用wait()notify()来完成切换,但是很明显,这俩都在UI线程中,wait()就会一直wait,根本不会notify。然后我搜了半天,终于找到一个看起来靠谱的方法,用loop()来阻塞,用RuntimeException来结束loop。

我试了一下,完全可行。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public synchronized String getText(String s) {
final String[] s1 = {""};
InputDialog id = new InputDialog(GameActivity.this) {
@Override
public void get(String str) {
s1[0] = str;
cancel();
throw new RuntimeException();
}
};
id.showAndGetText(s);
try {
Looper.loop();
} catch(RuntimeException ignored) {
}
return s1[0];
}

本站总访问量