示例:
同步Vesrion:
int weather = getWeather();
异步版本:
getweather(回调)到另一个类,当其他类准备返回值时,它使用回调。 callback.receiveWeather(温度);和回调对象有一个重写的receiveWeather(int)方法。
问题:
现在如何将异步方法转换为android中的同步调用。你能举个例子吗?我知道它有一些事情可以做线程,等()等..但不知道实现它。
答案 0 :(得分:0)
以下代码可以满足您的需求,但是如果只需要异步例程,只需创建一个阻塞getter并用AsyncTask
包装它就更好了。
当嵌套时,请确保
wait()
主线程特别是如果你用一个没有良好记录的线程机制包装一些只有async的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();
}
}
}
}
}
请参阅Guarded Blocks。
答案 1 :(得分:-1)
在被调用的方法中,只需返回结果,而不是调用回调方法并传入结果。所以改变方法签名:
public void getWeather(WhateverCallback<Type> callback)
对此:
public Type getWeather()