【问题标题】:Let thread wait for dialog input让线程等待对话框输入
【发布时间】:2015-12-17 21:23:32
【问题描述】:

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

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(一个包含对String 的引用的简单类)上进行了尝试

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

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

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

【问题讨论】:

  • 您是否使用了 OKHttp 或 Java 的 URLConnection 等库无法处理的自定义网络协议?看来您的应用程序编码水平非常低。
  • 我不使用除了 BouncyCastle 之外的任何库,我需要 BKS 支持。我开发的协议适用于状态,我稍微修改了 SSL 握手。

标签: java android multithreading service wait


【解决方案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);
}

【讨论】:

  • 谢谢,这正是我想要完成的!我将编辑我的问题以使其更清楚。
猜你喜欢
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-13
  • 2011-12-13
相关资源
最近更新 更多