让线程等待对话框输入

时间:2015-12-17 21:23:33

标签: java android multithreading service wait

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

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. 打电话
  3. 通知discoveryActivity显示AlertDialog
  4. 用户需要大约20秒的时间来输入数据并确认输入。

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

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

    轻松访问discoveryService

    问题2: 如何在不重新启动的情况下让线程再次运行?该线程处于一个复杂的循环中,现在只有几个Socket

    我的第一个想法是保持线程正常运行

    // Inside run()
    while(stringWrapper.get() == null) {
        Thread.sleep(500);
    }
    
    // Outside run()
    void setStr(String s) { stringWrapper.set(s); }
    

    但那效率低下

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

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

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

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

1 个答案:

答案 0 :(得分:1)

不是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);
}