实施例:如何异步方法调用(回调)转换为一个同步方法调用Android中
同步Vesrion:
INT天气=的GetWeather();
异步版本:
的GetWeather(回调)其他类和当其他类准备返回值,它使用回调。 callback.receiveWeather(温度);并且回调对象具有重写的receiveWeather(int)方法。
问:
现在我该怎样转换异步方法在Android的同步调用。你能举个例子吗?我知道它有什么要做的线程,等待()等,但不知道要执行它。
实施例:如何异步方法调用(回调)转换为一个同步方法调用Android中
同步Vesrion:
INT天气=的GetWeather();
异步版本:
的GetWeather(回调)其他类和当其他类准备返回值,它使用回调。 callback.receiveWeather(温度);并且回调对象具有重写的receiveWeather(int)方法。
问:
现在我该怎样转换异步方法在Android的同步调用。你能举个例子吗?我知道它有什么要做的线程,等待()等,但不知道要执行它。
在被调用的方法中,不是调用回调方法并传递结果,而是返回结果。所以改变此方法的签名:
public void getWeather(WhateverCallback<Type> callback)
要这样:
public Type getWeather()
为什么选择投票? – nasch
下面的代码你想要做什么,但它是更为最好只创建一个阻塞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();
}
}
}
}
}
请参阅Guarded Blocks。
请注意,您通常不应该在UI线程上调用(并且通常无法获得返回的结果)这样的方法。 –
@ChrisStratton我认为这个问题有一个价值,因为如果你已经在'AsyncTask'中,并且试图避免长链异步调用,每次调用写一行代码,这样的转换就会很有用。 – kftse