我正在使用 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
类,它通过 update()
方法实现 Observer
每当观察者更新时调用.目前在 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 中使用的数据来对监听器中发生的事件“ react ”,但我不确定我使用的是 Observable/适当的观察者模式,而且由于这是 Firebase 获取数据的异步事件,因此使用观察者一直是执行此操作的最佳方式。
在我的 Activity 的 onCreate()
中调用了 appDrawer()
方法。
如何使用 Observer 从 Listener 检索数据,以便在其他地方使用它?
最佳答案
我无法根据您的设计判断实际情况。命名一个类 Listener
然后让它成为 Observable
似乎违反直觉。听者倾听或观察。尽管如此,听起来你在 Listener
中还有另一个类,它是一个 Observer
所以我有点迷茫,但你似乎不确定你是否正确实现了模式。我可以举个例子来说明这一点。
public class MyObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println(arg + " " + ((MyObservable)o).name);
}
}
public class MyObservable extends Observable {
public String name = "Observable";
public void changeMe(String word) {
setChanged();
notifyObservers(word);
}
}
public class Test {
public static void main(String[] args) {
MyObservable myObservable = new MyObservable();
myObservable.addObserver(new MyObserver());
myObservable.changeMe("Hello");
}
}
update
方法为您提供了您正在观察的对象以及您传递给 notifyObservers()
的参数(您希望与观察者共享的数据)。如果你这样做了,那么你应该得到你期望的行为。
如您所见,数据可以发送到可观察对象外部或内部的观察者。当你运行它时,输出是...
Hello Observable
关于java - 如何实现观察者以从监听器获取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35095793/