【问题标题】:How to make addSnapshotListener to not start a new activity? Works with Java but not Kotlin如何使 addSnapshotListener 不启动新活动?适用于 Java 但不适用于 Kotlin
【发布时间】:2019-12-25 20:36:36
【问题描述】:

我在 onCreate 活动中有以下代码(尝试使用 onStart,效果不佳)。每次文档 gameID 中的任何字段发生更改时,活动都会使用新数据重新开始。是否可以让它更新文本字段 mPlayersLeft 而无需再次启动相同的活动?活动堆栈,我需要为已进行的每个更新按下回。也尝试了执行器,但似乎不起作用。

示例:这是一个有问题的游戏。当我回答 5 个问题时,我进入第 6 个问题,我通过控制台更新任何游戏字段,活动再次从问题 1 开始,使用新玩家计数(如果我已更新该字段),如果我要回击,我回到第 6 个问题的相同活动。

我已经尝试了所有这些,只有当它是 Java 时,它才能工作。我还没有找到任何有效的 Kotlin 变体。

科特林:

db.collection("games").document(gameID)
    .addSnapshotListener { snapshot, e ->
            if (e != null) {
                Log.w(tag, "Listen failed.", e)
                return@addSnapshotListener
            }
            if (snapshot != null && snapshot.exists()) {
                val players = snapshot.data?.get("players") ?: 0
                if (players != 0) {
                    mPlayersLeft!!.text = "$players"
                }
            } else {
                Log.d(tag, "Current data: null")
            }    
     }

Java:

db.collection("games").document(gameID)
                .addSnapshotListener(new EventListener<DocumentSnapshot>() {
                    @Override
                    public void onEvent(@Nullable DocumentSnapshot snapshot,
                                        @Nullable FirebaseFirestoreException e) {
                        if (e != null) {
                            Log.w(TAG, "Listen failed.", e);
                            return;
                        }
                        if (snapshot != null && snapshot.exists()) {
                            long players = (long) snapshot.getData().get("players");
                            mPlayersLeft.setText("" + players);
                        } else {
                            Log.d(TAG, "Current data: null");
                        }
                    }
                });

侦听器 Java 到 Kotlin(通过 Android Studio 翻译):

db.collection("games").document(gameID)
        .addSnapshotListener(EventListener { snapshot, e ->
            if (e != null) {
                Log.w(tag, "Listen failed.", e)
                return@EventListener
            }
            if (snapshot != null && snapshot.exists()) {
                val players = snapshot.data?.get("players") ?: 0
                if (players != 0) {
                    mPlayersLeft!!.text = "$players"
                }
            } else {
                Log.d(tag, "Current data: null")
            }    
     }

【问题讨论】:

  • 您所说的“活动以新数据重新开始”到底是什么意思?请具体说明您正在观察的内容。
  • 这就是为什么我在那之后添加了一个示例。在整个应用程序的生命周期中,随着每个新的 Firestore 字段更改,都会出现一个新的活动。示例:开始活动 -> 问题活动(字段更改开始另一个)-> 问题活动等。
  • 您在此处显示的代码根本不会启动新活动,因此根据我们所看到的,完全不清楚为什么会发生这种情况。 Kotlin 永远不会对等价的 Java 不会做的活动做一些特殊的事情。没有更多细节,真的无法说。
  • 经过进一步调试,我发现它与 getStringExtra 相关,因为当我使用 getStringExtra 并将其设置为 gameID 时,它会这样做,但是当我在 document("someStaticString") 中使用静态字符串时,一切如我所愿。
  • 这里的信息真的不够。我建议使用完全重现问题的 MCVE 编辑问题,以便每个人都可以看到所有活动部分。 stackoverflow.com/help/minimal-reproducible-example

标签: java android firebase kotlin google-cloud-firestore


【解决方案1】:

尝试将 this(activity context) 作为第一个参数传递。它将自动处理 acivity 生命周期。例如,如果您在 onCreate() 中调用此侦听器并将其作为 第一个参数然后它将在活动的 onDestroy() 方法中删除此侦听器。

db.collection("games").document(gameID)
            .addSnapshotListener(this,new EventListener<DocumentSnapshot>() {
                @Override
                public void onEvent(@Nullable DocumentSnapshot snapshot,
                                    @Nullable FirebaseFirestoreException e) {
                    if (e != null) {
                        Log.w(TAG, "Listen failed.", e);
                        return;
                    }
                    if (snapshot != null && snapshot.exists()) {
                        long players = (long) snapshot.getData().get("players");
                        mPlayersLeft.setText("" + players);
                    } else {
                        Log.d(TAG, "Current data: null");
                    }
                }
            });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    相关资源
    最近更新 更多