2016-04-23 77 views
0

實施例:如何異步方法調用(回調)轉換爲一個同步方法調用Android中

同步Vesrion:

INT天氣=的GetWeather();

異步版本:

的GetWeather(回調)其他類和當其他類準備返回值,它使用回調。 callback.receiveWeather(溫度);並且回調對象具有重寫的receiveWeather(int)方法。

問:

現在我該怎樣轉換異步方法在Android的同步調用。你能舉個例子嗎?我知道它有什麼要做的線程,等待()等,但不知道要執行它。

+0

請注意,您通常不應該在UI線程上調用(並且通常無法獲得返回的結果)這樣的方法。 –

+0

@ChrisStratton我認爲這個問題有一個價值,因爲如果你已經在'AsyncTask'中,並且試圖避免長鏈異步調用,每次調用寫一行代碼,這樣的轉換就會很有用。 – kftse

回答

-1

在被調用的方法中,不是調用回調方法並傳遞結果,而是返回結果。所以改變此方法的簽名:

public void getWeather(WhateverCallback<Type> callback) 

要這樣:

public Type getWeather() 
+0

爲什麼選擇投票? – nasch

0

下面的代碼你想要做什麼,但它是更爲最好只創建一個阻塞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