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;
    }

我的问题是我应该怎么做?我怎样才能将活动和服务分开,但仍然等待活动中的响应,直到服务类从解析中获得回调。我在这里先向您的帮助表示感谢!

4

4 回答 4

1

好吧,我不是 Android 开发人员,但在 Java 中,您可以使用对象的 wait() notifiy() 方法等待发生某些事情。但考虑到您可以在已经调用 notify() 之后进入 wait() 的竞争条件。

于 2013-05-03T14:49:41.277 回答
1

如果 Service 的生命周期与您的 Activity 无关,您可以绑定到它,然后通过 Binder 对象获取对 Service 的引用。最简单的通信方法是以类似于本项目的方式使用 Messenger 对象。

在这个特定的例子中,我假设您正在等待登录,然后用户才能使用登录屏幕以外的任何内容。您可能可以在 AsyncTask 或更好的 Fragment/Loader 模型中执行登录。在适当的回调方法中,您将执行登录后操作。

于 2013-05-03T16:21:02.963 回答
1

我有一个非常相似的问题,但对于 Parse 和 iOS。我在这里发布了这个问题以及我找到的答案。您可能会发现自己使用 JavaScript 为 Parse 编写云代码。为此,您需要学习使用 Promises。我在 iOS 中管理异步的解决方案是在 iOS 中实现 Promises。他们允许我以非常干净的方式封装我的后台 Parse 操作。同样的技巧可能对你有用。

我发布到 GitHub 的代码可能会有所帮助,但它是在 Objective-C 中的。

-鲍勃

于 2013-05-04T02:10:35.487 回答
1

我不清楚为什么您需要围绕 Parse 的 API 进行抽象,但我会推荐一些非常简单的东西。Parse 的 API 已经处理线程安全,因此您可以编写接口来查询 Parse 状态和 KISS。IE

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;
  }
}
于 2013-05-06T17:22:05.360 回答