2011-04-25 160 views
3

Java新手在這裏。我正在使用第三方庫,它給了我一個函數,比如說F(),它的輸出決定了我的邏輯。所以我需要在我的代碼中進一步處理它的結果。等待線程完成執行

問題是F()做了一些I/O,因此產生了一個線程來完成這個功能。他們給了我幾個回調來實現哪些被調用來從線程返回狀態/值。這很好,除了函數F()立即返回並且我的代碼的其餘部分繼續運行。我不希望這樣,因爲我必須根據F()的結果分配一些對象,所以我真的想等F()真正完成。

這應該是人們經常碰到的問題。處理這個問題的正確方法是什麼?這是我的設計或第三方庫中的問題嗎?或者我不是很瞭解圖書館?

爲了完整起見,我正在開發一個android應用程序,該庫是facebook sdk。該函數是單點登錄函數authorize()。雖然這是一個足夠普遍的問題,我認爲最好在Java論壇中解決。

感謝您的任何幫助。 - P

回答

3

想想這個:
一個Android應用程序的主線程是管理線程用戶界面,所以如果你想等到f()方法結束,屏幕將會凍結。你可能會認爲一個好的解決方案是產生一個新的線程,並調用其中的方法f(),並使用可調用或未來來等待f()。錯誤。線程創建下面的代碼將會執行,所以你將會遇到同樣的問題。
那麼你如何解決這個問題?簡單。重新設計您的應用程序並使用監聽器,a.k.a.回調。

編輯:偵聽器或回調只是一個方法(或多個方法),類A實現並將此實現傳遞給類B以執行它。 B類不知道他在執行什麼,他只是執行一個方法。

例子:

public class A{ 
    public A(){ 
     B b = new B (new B.Listener(){ 
      @Override 
      void onResult (String result){ 
       //result is "Core dumped!" 
      } 
     }); 
     b.aMethod(); 
    } 
} 

public class B{ 
    private final Listener listener; 

    public static interface Listener{ 
     void onResult (String result); 
    } 

    public B (Listener listener){ 
     if (listener == null) throw new IllegalArgumentException ("The \"listener\" parameter cannot be null."); 
     this.listener = listener; 
    } 

    public void aMethod(){ 
     //Do something interesant 
     //... 
     String error = "Core dumped!" 

     //Call the listener 
     listener.onResult (error); 
    } 
} 

在你的情況,你將有一些與此類似:

public class YourClass{ 
    public void aMethod(){ 
     FaceBookClass fb = new FaceBookClass(); 
     fb.setListenerToF (new FaceBookClass.FListener(){ 
      @Override 
      void theCallback (Result aResult){ 
       //Do something with result 
      } 
     }); 
     fb.f(); 

    } 
} 

public class FaceBookClass{ 
    public static interface FListener{ 
     void theCallback (Result aResult); 
    } 

    public void f(){ 
     ... 
    } 

    public void setListenerToF (FListener listener){ 
     ... 
    } 
} 
+0

正是我的問題!你明白了! FB sdk提供了一個wait()方法,但是如果我在主線程中調用它,它不會解決問題,因爲它只會凍結屏幕。這個回調是什麼?我將不得不檢查。你能提供一個鏈接嗎?問題是我的視圖是根據登錄操作的結果繪製的。 – user220201 2011-04-25 14:59:33

+0

看看我的答案。 – 2011-04-25 15:17:55

+0

感謝您的回答。在這種情況下,b.aMethod()的行爲是什麼?它會等待回調嗎?由於aMethod()本質上是創建一個線程並在該線程中執行有趣的部分。在我的情況下,funct F()採用DialogListener而不是構造函數。所以我通過它,但F()立即返回,並在一個點後調用回調。但在繼續執行其他邏輯之前,確實想等待回調被調用。 – user220201 2011-04-25 16:08:46