實施例:如何異步方法調用(回調)轉換爲一個同步方法調用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