今、firebaseを使ってリアルタイムで情報を送受信して遊ぶちょっとしたゲームを作っています。
公式サイトには、リスナーのデタッチはlistener.remove()でできるとあったのですが、デタッチ出来てないみたいです。
listeningSelectedCards?.remove()
このすぐ下にログを入れたところ
Log -> D/listeningSelectedCards: com.google.firebase.firestore.core.ListenerRegistrationImpl@c3b3b7b
このように出ました。nullではないので、remove出来てないという認識でいいのでしょうか?それともこれはデタッチはできているのでしょうか?
<コード>
locateEachCardメソッドにListenerRegistrationを設置しました。
フラグメントを閉じた時に呼び出されるOnGoBackOnGameSettingFragmentメソッドでlistenerRegistrationをデタッチしました。(はずだが、されていなかった?)
Fragmentのコードもさらに下の方に載せました。
private fun locateEachCard() { listeningWords = database.collection(dbCollection).document(keyword).collection("words").document(keyword) .addSnapshotListener { it, e -> if (e != null) return@addSnapshotListener if (it == null || !it.exists()) return@addSnapshotListener val wordsDataList = mutableListOf<WordsData>() val hashmap = it["words"] as MutableList<HashMap<String, String>> for(i in 0 .. 24){ wordsDataList.add(WordsData(hashmap[i]["word"], hashmap[i]["color"])) } listeningSelectedCards = database.collection(dbCollection).document(keyword).collection("selectedCards").addSnapshotListener { query, e -> if(e != null) return@addSnapshotListener val selectedCardList = mutableListOf<WordsData>() supportFragmentManager.beginTransaction().remove(ResultFragment()).commit(); if(query == null || query.isEmpty){ remaining_red.setText("赤カードの残り枚数:") remaining_blue.setText("青カードの残り枚数:") red_number_of_remaining.setText("8") blue_number_of_remaining.setText("7") turn = Turn.RED_TEAM_TURN text_which_team_turn.setText("赤チームのターンです") } else{ willUpdate(query, selectedCardList) } newTurn() val listItem = mutableListOf<String>() val adapter = CardAdapter(wordsDataList, selectedCardList, object : CardAdapter.OnCardAdapterListener { override fun OnClickCard(word: String, wordsData: WordsData, holder: CardAdapter.ViewHolder) { showWhatYouClicked(listItem, word, wordsDataList) } }) recycler_view.layoutManager = GridLayoutManager(this, 5) recycler_view.adapter = adapter if(ifGameIsOver) showResultFragment() } } } . . . . . . . . override fun OnGoBackOnGameSettingFragment() { listeningWords?.remove() listeningSelectedCards?.remove() listeningMembers?.remove() Log.d("listeningSelectedCards", "$listeningSelectedCards" //D/listeningSelectedCards: com.google.firebase.firestore.core.ListenerRegistrationImpl@c3b3b7bと出ました teamToCollectAllCards = "" teamGotGray = null ifGameIsOver = false //下ではfirebaseの”selectedCards"というコレクションにあるドキュメントを一つ一つ処理しています。(もっと効率な方法あったら教えてください) database.collection(dbCollection).document(keyword).collection("selectedCards").get().addOnSuccessListener { for( i in 0 until it.documents.size){ val documentId = it.documents[i].id database.collection(dbCollection).document(keyword).collection("selectedCards").document(documentId).delete() } recycler_view.layoutManager = null recycler_view.adapter = null btn_explain.visibility = View.INVISIBLE text_which_team_turn.setText("") remaining_red.setText("") remaining_blue.setText("") blue_number_of_remaining.setText("") red_number_of_remaining.setText("") importWordsFromCSV() supportFragmentManager.beginTransaction() .replace(R.id.container_game, GameSettingFragment.newInstance(keyword, nickname)) .commit() } }
ゲーム終了時のResultフラグメントです。(ここからOnGoBackOnGameSettingFragmentメソッドを呼び出すので、載せておきます。)
class ResultFragment : Fragment() { . . . override fun onActivityCreated(savedInstanceState: Bundle?) { . . . btn_another_game_start.setOnClickListener { database.collection(dbCollection).document(keyword).update("readyForAnotherGame", true) } btn_back_game_setting.setOnClickListener { database.collection(dbCollection).document(keyword).update("readyToEndGame", true) } listening = database.collection(dbCollection).document(keyword).addSnapshotListener { it, e -> if (e != null) return@addSnapshotListener if (it == null ) return@addSnapshotListener val endGame = it.getBoolean("readyToEndGame")?: false Log.d("endGame", "$endGame") if(endGame){ listener?.OnGoBackOnGameSettingFragment() getFragmentManager()?.beginTransaction()?.remove(this)?.commit() return@addSnapshotListener } val tryAnotherGame = it.getBoolean("readyForAnotherGame")?: false Log.d("tryAnotherGame", "$tryAnotherGame") if(tryAnotherGame){ listener?.OnStartAnotherGame(turnCount) getFragmentManager()?.beginTransaction()?.remove(this)?.commit() return@addSnapshotListener } } } . .
回答1件
あなたの回答
tips
プレビュー