【发布时间】:2016-05-07 20:29:12
【问题描述】:
我正在使用MaterialDrawer 库为我的应用程序创建一个简单的抽屉,库中的一些类实例在调用时需要一个字符串传递给它们。一个例子是IProfile 类:
IProfile profile = new ProfileDrawerItem().withName("John Doe");
withName() 方法接收一个字符串。
我创建了一个类 MyObservable.java(扩展 Observable)类,我打算用它来获取要在我的 MainActivity 中使用的数据,该类实现了 MaterialDrawer 库。在这堂课中,我有一个方法implementData(),它有我的监听器来满足我从我的firebase数据库中需要的东西。
这就是它的样子:
public class MyObservable extends Observable {
// Attach our firebase reference...
Firebase userRef = new Firebase("https://myApp.firebaseio.com/users");
AuthData authData;
public String username = "";
public String email = "";
public void changeUsername(String username) {
this.username = username;
setChanged();
notifyObservers(username);
}
public void implementData(){
// Get the authentication data of our user from the reference.
authData = userRef.getAuth();
// This is the listener I have to get the data from.
userRef.child(authData.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
UserSchema user = snapshot.getValue(UserSchema.class);
// This guy needs to be used in the MainActivity appDrawer() method
String userName = user.getName();
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
}
}
class MyObserver implements Observer {
public void update(Observable observable, Object data) {
// For now I just print it out to System.out
System.out.println("Username:" + data);
}
}
然后我使用changeUsername() 方法通知我的观察者用户名更改:
public void changeUsername(String username) {
this.username = username;
setChanged();
notifyObservers(username);
}
在 MyObservable 类中,我有一个 MyObserver 类,它实现 Observer 并在观察者更新时调用 update() 方法。在目前的update() 方法中,我只是打印出用户的username 以确保确实发生了一些事情。
这是我需要来自观察者的数据的地方(在 MainActivity 中):
public class MainActivity extends AppCompatActivity {
...
public void appDrawer(){
IProfile profile = new ProfileDrawerItem()
// I need the user's data here
.withName("Test")
.withEmail("test@test.com")
.withIcon(R.drawable.avatar2);
}
...
}
我花了几个小时试图通过尝试检索要在我的 MainActivity 中使用的数据来对侦听器中发生的事件进行“反应”,但我不确定我是否正在使用 Observable/正确的观察者模式,因为这是 Firebase 获取数据的异步事件,所以使用观察者是最好的方法。
appDrawer() 方法在我的 Activity 的 onCreate() 中调用。
如何使用 Observer 从 Listener 检索数据,以便在其他地方使用它?
【问题讨论】:
标签: java android firebase observer-pattern observable