java - 让线程等待对话框输入

标签 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. 通知 discoveryActivity 显示一个 AlertDialog

用户输入数据大约需要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:我想让一个线程暂停,直到它接收到数据

最佳答案

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

关于java - 让线程等待对话框输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34344489/

相关文章:

java - 如何使用 Spring Boot 和 Angular 7 配置 CRSF

java - Netbeans 警告 : Method is declared final

android - flutter : How to Debug which widgets re-rendered on state change

android - 用于数字液晶显示器的 Firebase MLkit 文本识别

java - eclipse 调试器中的详细 java 线程状态?

java - 空指针异常(未解决)和无法将 WSResponse 映射到 play 2.4 中的结果(这部分已解决。我猜)

java - 如何调用永久命令提示符?

android - GCM 是云端点还是独立实体?

C# 多线程 - 告诉等待进程第一个进程已完成使用锁定代码?

c# - 尽管有 UI 上下文,但任务 ContinueWith 导致跨线程异常