2013-05-03 158 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