Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使addSnapshotListener不启动新活动?适用于Java,但不适用于Kotlin_Java_Android_Firebase_Kotlin_Google Cloud Firestore - Fatal编程技术网

如何使addSnapshotListener不启动新活动?适用于Java,但不适用于Kotlin

如何使addSnapshotListener不启动新活动?适用于Java,但不适用于Kotlin,java,android,firebase,kotlin,google-cloud-firestore,Java,Android,Firebase,Kotlin,Google Cloud Firestore,我在onCreate活动中有以下代码(在onStart中尝试过,但效果不佳)。每当文档gameID中的任何字段发生更改时,活动都会以新数据重新开始。是否可以只更新文本字段mPlayersLeft而不重新启动相同的活动?活动堆栈和我需要为已进行的每个更新按back键。与遗嘱执行人一起尝试过,但似乎不起作用 这是一个有问题的游戏。当我回答5个问题时,我进入问题6,我通过控制台更新任何游戏场,活动从问题1开始,新的玩家数量(如果我更新了该场)再次开始,如果我要按back,我将返回到第6个问题的相同活动

我在onCreate活动中有以下代码(在onStart中尝试过,但效果不佳)。每当文档gameID中的任何字段发生更改时,活动都会以新数据重新开始。是否可以只更新文本字段mPlayersLeft而不重新启动相同的活动?活动堆栈和我需要为已进行的每个更新按back键。与遗嘱执行人一起尝试过,但似乎不起作用

这是一个有问题的游戏。当我回答5个问题时,我进入问题6,我通过控制台更新任何游戏场,活动从问题1开始,新的玩家数量(如果我更新了该场)再次开始,如果我要按back,我将返回到第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")
            }    
     }
爪哇:

尝试将此(活动上下文)作为第一个参数传递。它将自动处理活动 生命周期例如,如果在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");
                    }
                }
            });
db.collection(“游戏”)文档(gameID)
.addSnapshotListener(此,新的EventListener(){
@凌驾
public void onEvent(@Nullable DocumentSnapshot快照,
@可为空的FireBaseFireStore异常(e){
如果(e!=null){
Log.w(标记“侦听失败”,e);
回来
}
if(snapshot!=null&&snapshot.exists()){
long players=(long)snapshot.getData().get(“players”);
mPlayersLeft.setText(“+players”);
}否则{
Log.d(标记“当前数据:null”);
}
}
});

您所说的“活动以新数据重新开始”到底是什么意思?请具体说明您所观察到的内容。这就是为什么我在后面添加了一个示例。在整个应用程序的生命周期中,每次新的Firestore字段更改都会出现一个新的活动。示例:启动活动->问题活动(字段更改启动另一个)->问题活动等。此处显示的所有代码都不会启动新活动,因此根据我们看到的情况,完全不清楚为什么会发生这种情况。Kotlin永远不会对这个活动做类似Java不会做的事情。如果没有更多的细节,就不可能说了。通过进一步的调试,我发现它与getStringExtra相关,就像我使用getStringExtra并将其设置为gameID时,它会这样做,但当我在文档中使用静态字符串(“someStaticString”)时,一切都按照我的要求运行。这里的信息确实不够。我建议用一个MCVE编辑这个问题,这个MCVE完全复制了这个问题,这样每个人都可以看到所有移动的部分。
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")
            }    
     }
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");
                    }
                }
            });