我想检查用户是否已在应用程序中登录,为此,我有方法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()
之后调用它