后台: 我正在练习Android开发 试图制作一个从远程http服务器获取一些数据的应用程序 Android系统要求在单独的线程中完成http请求。
所以,我有一个主线程,一些UI交互发生,第二个线程(实现Runnable接口),发出http请求。 第二个帖子中有两种可能的情况:
所以问题:
线程之间异步通信的最佳实践是什么?
我不能暂停(睡眠,等待)我的主线程,因为用户应该能够与UI进行交互。
由于
UPD :
重要的是“Android”才是测试的地方
我想使用“本机”Java库/类/...
答案 0 :(得分:0)
有很多方法可以做到这一点。我通常这样做(在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()的内容。
的修改
根据{{3}},它是一种用于在UI线程上运行代码片段的方法。这意味着您可以从任何线程安全地调用它。您唯一需要考虑的是 - 在您的线程中使用mainActivity引用。
的 EDIT2 强>
如果您要在纯Java中执行此操作 - 请使用synchronized方法安全地访问对象的内容,例如:
public class YourClassWithSychMethod {
private int i;
public synchronized void set(int val) {
i=val;
}
public synchronized int get() {
return i;
}
}
这意味着您可以从任何线程调用这些方法。它可能不是专门的课程,而是您的任何课程。
所以场景如下:
- 线程A调用set()
,因此通知线程B关于某些事件
- 线程循环中的Tread B调用get()
以检查是否满足所需条件并作出相应反应。注意,线程B可能不使用线程循环,而是使用任何其他循环,计时器等。
的 EDIT3 强>
您也可以向您的UI主题发送消息,如docs on runOnUiThread()中所述,或者docs
PS HTTP请求怎么样 - 我对here(或其对应的SyncHttpClient非常满意,如果您不仅需要移动http请求而且全部相关工作到非UI线程)。这个库通过线程和http通信处理来解决很多麻烦
答案 1 :(得分:-1)
在主线程中使用YourThread.join()。这将阻止主线程的工作直到你从YourThread得到响应。您可以根据来自YourThread的响应决定向用户/程序流显示响应。
同时,当主线程正在工作时,您向用户显示一个Toast,声明正在获取HTTP信息。