2013-05-03 156 views
1

我使用parse.com作爲我的Android應用程序的後端服務。我希望分離我的活動和解析,爲此我創建了服務類女巫將橋接活動和解析(後端)。大多數解析函數是異步的,我不知道如何處理它們。例如,如果我想用一個用戶登錄,我將調用應該使用解析登錄函數執行登錄的服務對象。所以這是我在活動代碼:調用異步函數

LoginService login = new LoginService("username", "password"); 
login.login(); 
//from here it is not correct 
if(login.getLoginStatus() == 2) { 
    //user loggedin 
}... 

,我的服務代碼是:

public LoginSrvice(String userName, String pass) 
    { 
     this.userName = userName; 
     this.pass = pass; 
    } 

    public void loginUser() 
    { 
     ParseUser.logInInBackground(userName, pass, new LogInCallback() 
     { 

      @Override 
      public void done(ParseUser user, ParseException e) { 
       if (user != null) { 
         logedIn = 1; 
       } else { 
         logedIn = 2; 
       } 
      } 
     }); 
    } 

    public int getLoginStatus() 
    { 
     return logedIn; 
    } 

我的問題是我應該怎麼做是正確的?我如何保持活動和服務分離,但仍然等待活動中的響應,直到服務類從解析中獲得回調。 感謝您的幫助提前!

回答

1

嗯,我不是Android開發人員,但在Java中,您可以使用對象的wait()notifiy()方法等待,直到出現問題。 但考慮到您可以在notify()已被調用後等待的競爭條件中進入。

+0

你能舉個例子嗎? – vlio20 2013-05-03 15:29:52

+1

在這個條目:http://stackoverflow.com/questions/7713786/java-make-a-method-wait-for-a-response-of-another-process/7713815#7713815你會發現一個樣本。正如我所說,是一個Java中的通用程序 – 2013-05-07 15:04:12

1

如果服務的生命週期不與您的活動掛鉤,您可以bind to it,然後get a reference to the Service via the Binder object。最簡單的通信方法是以類似於this project的方式使用Messenger對象。

在這個特定的例子中,我假設你在登錄屏幕之前用戶可以使用任何東西之前等待登錄。您可能可以在AsyncTask中執行登錄,或者甚至可以更好地執行Fragment/Loader模型。在適當的回調方法中,您需要執行登錄後操作。

+0

我的服務類不是一個Android服務類,它只是活動和解析方法之間的一些緩衝區。我在網上找不到任何解決方案。 AsyncTask僅適用於稍後可能需要從我的服務中調用多個任務的一項任務,稱所有CRUD壓縮。如果有任何解決方案,我會感激! – vlio20 2013-05-04 19:26:07

1

我有一個非常類似的問題,但對於Parse和iOS。我在SO上發佈了問題here以及我發現的答案。您可能會發現自己正在使用JavaScript for Parse編寫Cloud代碼。爲此,您需要學習使用Promise。我在iOS中管理異步的解決方案是在iOS中實現Promises。他們允許我以非常乾淨的方式封裝我的背景分析操作。同樣的技巧可能適合你。

有可能我發佈給GitHub的代碼有幫助,但它在Objective-C中。

-Bob

1

我不清楚爲什麼你需要周圍解析的API的抽象,但我會建議很簡單的東西。 Parse的API已經處理了線程安全性,所以你可以編寫你的接口來查詢Parse狀態和KISS。即

class UserAbstraction { 
    // You may find it useful to also use the callback object for other reasons. 
    public static void logIn(string userName, string password) { 
    ParseUser.logInInBackground(userName, password); 
    } 

    public static boolean isLoggedIn() { 
    return ParseUser.getCurrentUser() == null; 
    } 
} 
+0

我需要它將活動與後端調用分開,也許明天我會更換我的後端提供程序。 – vlio20 2013-05-06 20:14:19