@Override方法不会更改值

时间:2014-08-18 20:42:13

标签: java android annotations override

我想检查用户是否已在应用中登录,为此我使用方法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注释有关?

1 个答案:

答案 0 :(得分:1)

当您致电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()之后调用