让线程等待对话框输入

Let thread wait for dialog input

我编写了一个这样工作的结构:

Activity discoveryActivity - UI thread
 ↕ Calls through interface
Service discoveryService   - Bound service running on UI thread
 ↕ Actions through Handler.post(↑) or functions (↓)
Runnable connectionThread  - Socket networking

在某些时候 connectionThread 需要 String 才能继续。

  1. 所以我用 Handler.post(..)discoveryService 打电话
  2. 通知discoveryActivity显示一个AlertDialog

用户输入数据大约需要20秒,然后会确认输入。

问题1: 线程在此期间会做什么?

现在我需要再次进入线程。

到达 discoveryService 很容易

问题2: 如何在不重启的情况下让线程再次工作?该线程现在处于一个复杂的循环中,现在有几个 Sockets!

我的第一个想法是保留线程 运行

// Inside run()
while(stringWrapper.get() == null) {
    Thread.sleep(500);
}

// Outside run()
void setStr(String s) { stringWrapper.set(s); }

但那样效率低下

然后我读到了 wait()notify() 我在线程本身和 StringWrapper 上尝试过(一个简单的 class,它包含对 String 的引用)

我很无奈,我认为 wait()notify() 是正确的方法吗?

你能给我一个提示,我应该在哪里实现这些以及它们将在哪个对象上被调用?

TL;DR: 我想让一个线程暂停直到它接收到数据

不能 100% 确定您要完成的任务,但您可以使用 SettableFuture(来自 Google Guava library)来解决您的问题。

private final SettableFuture<String> stringFuture = SettableFuture.create();

// Inside run()
// This will block your thread until stringFuture is set, or until the given timeout has expired.
final String string = stringFuture.get(1, TimeUnit.MINUTES);

// Outside run()
public void setStr(final String s) {
    stringFuture.set(s);
}