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