我想检查用户是否已在应用程序中登录,为此,我有方法loggedIn()

private Boolean loggedIn = false;

public boolean loggedIn() {
    Map<String, Object> parameters = new HashMap<String, Object>();
    parameters.put("ID", "me");
    Buddy.get("users/me", parameters, new BuddyCallback<User>(User.class) {
        @Override
        public void completed(BuddyResult<User> result) {
            if (result.getIsSuccess()) {
                setLoggedIn(true);
            }
        }
    });
    return loggedIn;
}

public void setLoggedIn(Boolean loggedIn){
    this.loggedIn = loggedIn;
}


因此,当用户登录时,它会执行setLoggedIn(true);行,这行得通。

唯一的问题是,无论是否执行loggedIn(),方法false总是返回setLoggedIn(true);。这与@Override注释有关吗?

最佳答案

调用loggedIn()时,正在执行对Buddy.get的潜在异步调用。这意味着Buddy.get可能会生成一个新线程,在该线程上调用completed

解决此问题的安全方法是将boolean loggedIn()更改为void loggedIn()。然后,您可以使用某种属性更改侦听器为所有类提供所有这些内容,例如:

public interface OnLoggedInChangedListener {
    public void onLoggedInChange(boolean loggedIn);
}

private OnLoggedInChangedListener loggedInListener; // This could also be a list of weak references

public void setOnLoggedInChangedListener(OnLoggedInChangedListener l) {
    loggedInListener = l;
}

public void setLoggedIn(Boolean loggedIn){
    this.loggedIn = loggedIn;
    if (loggedInListener != null) {
        loggedInListener.onLoggedInChange(loggedIn);
    }
}


另外,您可以使用更通用的属性更改侦听器,并将类的不同属性与属性枚举关联。即OnLoggedInChangedListener会变成PropertyChangeListener<MyClassPropertyEnum>enum MyClassPropertyEnum { LOGGED_IN }

另一个选择是loggedIn()可以接受侦听器作为参数,您可以在调用setLoggedIn()之后调用它

10-07 21:15