例子:
同步版本:
int 天气 = getWeather();
异步版本:
getweather(callback) 到另一个类,当其他类准备好返回值时,它使用回调。callback.receiveWeather(温度); 并且回调对象有一个被覆盖的 receiveWeather(int) 方法。
问题:
现在我如何将异步方法转换为 android 中的同步调用。你能给我一个例子吗?我知道它有一些事情要做线程,等待()等..但不知道要实现它。
例子:
同步版本:
int 天气 = getWeather();
异步版本:
getweather(callback) 到另一个类,当其他类准备好返回值时,它使用回调。callback.receiveWeather(温度); 并且回调对象有一个被覆盖的 receiveWeather(int) 方法。
问题:
现在我如何将异步方法转换为 android 中的同步调用。你能给我一个例子吗?我知道它有一些事情要做线程,等待()等..但不知道要实现它。
以下代码可以满足您的需求,但最好只创建一个阻塞 getter 并将其包装起来AsyncTask
,以防还需要异步例程。
当这是嵌套时,一定不要
wait()
主线程尤其是如果你包装了一些没有很好记录的线程机制的仅异步 API,这可以使这两种方法在同一个线程上运行。
public class AsyncToSync{
private Object lock= new Object();
private boolean ready = false;
public syncCallToAsyncMethod(){
new AsyncMethodProvider().doAsync(new CompletionListener(){
public void onComplete(){
// TODO: Do some post-processing here
synchronized(lock){
ready = true;
lock.notifyAll();
}
}
})
synchronized (lock) {
while (!ready) {
try {
lock.wait();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}
}
请参阅受保护的块。
在被调用的方法中,不是调用回调方法并传入结果,而是直接返回结果。因此,从此更改方法签名:
public void getWeather(WhateverCallback<Type> callback)
对此:
public Type getWeather()