[英]Asynchronous communication between threads in Java
后台:我正在从事Android开发。
尝试制作一个从远程http服务器获取一些数据的应用程序。
Android系统要求http请求必须在单独的线程中完成。
因此,我有一个主线程,其中发生了一些UI交互,第二个线程(实现Runnable接口)发出了HTTP请求。 第二个线程中有两种可能的情况:
所以问题是:
在线程之间异步通信的最佳实践是什么?
我无法暂停(睡眠,等待)主线程,因为用户应该可以与UI进行交互。
谢谢
UPD :
重要的是“ Android”只是测试的地方。
我想使用“本地” Java库/类/来实现结果。
有很多方法可以做到这一点。 我通常这样做(在MainActivity中):
public void notification(final int title, final int message, final int duration) {
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(MainActivity.this, message, duration).show();
}
});
}
此示例仅通知用户,但您可以添加或更改run()的内容。
编辑
根据runOnUiThread()上的文档,这是一种旨在在UI线程上运行代码段的方法。 这意味着您可以从任何线程安全地调用它。 您唯一需要考虑的就是在线程中拥有mainActivity引用。
编辑2
如果要使用纯Java进行操作,请使用同步方法安全地访问对象的内容,例如:
public class YourClassWithSychMethod {
private int i;
public synchronized void set(int val) {
i=val;
}
public synchronized int get() {
return i;
}
}
这意味着您可以从任何线程调用这些方法。 它可能不是专门的课程,而是您的任何课程。
因此, 场景如下:
-线程A调用set()
,因此将某些事件通知线程B
-线程循环中的踩B调用get()
来检查是否满足所需条件并做出相应反应。 请注意,线程B可以不使用线程循环,而可以使用任何其他循环,计时器等。
编辑3
您还可以将消息发送到您的UI线程,如docs中所述或例如此处
PS HTTP请求怎么样-我对AsyncHttpClient (或者与之对应的SyncHttpClient感到非常满意,如果您不仅需要将http请求,而且所有相关工作都移到非UI线程中)。 该库解决了线程和http通信处理方面的许多麻烦
在主线程中使用YourThread.join()。 这将停止主线程的工作,直到您从YourThread获得响应。 而且,您可以根据YourThread的响应来决定显示给用户/程序流的响应。
同时,在主线程工作时,您向用户展示祝酒词,指出正在获取HTTP信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.