java - 如何实现观察者以从监听器获取数据?

标签 java android firebase observer-pattern observable

我正在使用 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/

相关文章:

java - Spring 无法加载 JDBC 驱动程序类错误

java - 如何阻止 Action 监听器重复之前的 Action

Android "O"(Oreo, 8) 和更高版本的媒体按钮问题

node.js - Webhook 调用失败。错误 : 500 Internal Server Error | Dialogflow | Firebase

java - 编译和运行 Java 控制台应用程序 OS X 终端时出现问题

java - 将 URL 与字符串进行所有可能的组合

java - 使用 Web 服务在 Java 中调用 C#.Net 函数

android - 针对 Android 12 的 list 合并失败

ios - Firebase - 将唯一 ID 保存在类变量中并将其数据发送到另一个 Controller - Swift

firebase - 没有为类 'instance' 定义 setter/getter 'FirebaseUser'