让线程等待对话框输入
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
才能继续。
- 所以我用
Handler.post(..)
给 discoveryService
打电话
- 通知
discoveryActivity
显示一个AlertDialog
用户输入数据大约需要20秒,然后会确认输入。
问题1: 线程在此期间会做什么?
现在我需要再次进入线程。
到达 discoveryService
很容易
问题2: 如何在不重启的情况下让线程再次工作?该线程现在处于一个复杂的循环中,现在有几个 Socket
s!
我的第一个想法是保留线程 运行
// 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);
}
我编写了一个这样工作的结构:
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
才能继续。
- 所以我用
Handler.post(..)
给discoveryService
打电话 - 通知
discoveryActivity
显示一个AlertDialog
用户输入数据大约需要20秒,然后会确认输入。
问题1: 线程在此期间会做什么?
现在我需要再次进入线程。
到达 discoveryService
很容易
问题2: 如何在不重启的情况下让线程再次工作?该线程现在处于一个复杂的循环中,现在有几个 Socket
s!
我的第一个想法是保留线程 运行
// 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);
}