# #android #firebase #kotlin #google-cloud-firestore #nullpointerexception
Вопрос:
Я создаю многопользовательскую игру для Android и создаю многопользовательские игровые комнаты. Но есть странная ситуация, которую я не решил. Когда я нажимаю кнопку, чтобы сначала создать многопользовательскую комнату, ее можно создать, но когда я возвращаюсь к заднему фрагменту и хочу создать снова, мое приложение выходит из строя.
class SeviyeBirFragment : Fragment() {
lateinit var db : FirebaseFirestore
lateinit var db2 : FirebaseFirestore
lateinit var mAuth : FirebaseAuth
val roomsList = arrayListOf<String>()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view : View = inflater.inflate(R.layout.fragment_seviye_bir, container, false)
return view
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
db = FirebaseFirestore.getInstance()
db2 = FirebaseFirestore.getInstance()
mAuth = FirebaseAuth.getInstance()
createGame.setOnClickListener {
startingTheGame()
}
}
private fun startingTheGame() {
createRoomButton.setOnClickListener {
createRoomButton.text = "Game is Creating..."
createRoomButton.isEnabled = false
playerName = mAuth.currentUser?.displayName.toString()
roomName = playerName
val hashMap = hashMapOf<Any,Any>()
if (roomName != null) {
hashMap.put("player1",roomName)
}
db.collection("Rooms").add(hashMap).addOnSuccessListener {
Toast.makeText(context,"Successful!!",Toast.LENGTH_SHORT).show()
roomListener()
}
}
listView.setOnItemClickListener { adapterView, view, i, l ->
roomName = roomsList.get(i)
println("roomlist a: " roomsList.get(i) )
println("roomlist a: " roomName )
val hashMap2 = hashMapOf<Any,Any>()
if (roomName != null) {
hashMap2.put("player2",roomName)
}
db.collection("Rooms").add(hashMap2).addOnSuccessListener {
Toast.makeText(context,"Successful",Toast.LENGTH_SHORT).show()
roomListener()
}
}
addRoomsEventListener()
}
private fun roomListener() {
db.collection("Rooms").addSnapshotListener { value, error ->
if (error != null) {
createRoomButton.setText("Create Game")
createRoomButton.isEnabled = true
Toast.makeText(context,"İnternet Sıkıntısı!",Toast.LENGTH_SHORT).show()
} else {
createRoomButton.setText("Create Game")
createRoomButton.isEnabled = true
val intent = Intent(activity,Main2Activity::class.java)
startActivity(intent)
requireActivity().finish()
}
}
}
private fun addRoomsEventListener() {
db2.collection("Rooms")
db2.collection("Rooms").addSnapshotListener { value, error ->
if (error == null) {
if (value != null){
if (!value.isEmpty){
val documents = value.documents
for ( document in documents) {
val deger = document.getString("player1")
val deger2 = document.getString("player2")
if (deger != null) {
roomsList.add(deger)
if (deger2 != null) {
roomsList.add(deger2)
}
}
val arrayAdapter : ArrayAdapter<String>? =
context?.let { ArrayAdapter(it,android.R.layout.simple_list_item_1,roomsList) }
println("roomlist: " roomsList)
listView.adapter = arrayAdapter
}
}
}
}
}
}
}
В этом коде при нажатии кнопки createRoomButton моя комната была создана первой, но при возврате назад и повторном нажатии приложение вылетает. Я проверил кнопку из XML, это не проблема для findViewById.
Это приводит к этой ошибке:
java.lang.Исключение NullPointerException: Попытка вызвать виртуальный метод ‘void android.widget.Листвью.Адаптер(android.виджет.ListAdapter)’ по нулевой ссылке на объект.
это относится к ListView.Адаптер = адаптер
Как можно решить эту проблему?
Комментарии:
1. Пожалуйста, поделитесь кодом, в котором вы используете .setAdapter().
2. Я уже поделился, это в addRoomsEventListener()
Ответ №1:
Я решил эту проблему. Возможно, любой человек может столкнуться с этой ошибкой, поэтому я объясню решение. На самом деле, я никогда не замечал, что прослушивание firestore продолжается при переключении между фрагментами или действиями. Прежде всего, я инициализирую ссылки таким образом ;
var reference: ListenerRegistration? = null
var reference2: ListenerRegistration? = null
После этого я выравниваю слушателей ;
reference = db.collection("Rooms").addSnapshotListener {...}
reference2 = db2.collection("Rooms").addSnapshotListener {...}
И, наконец, я удаляю эти ссылки, когда изменяю свой фрагмент или уничтожаю свою деятельность.
override fun onDestroyView() {
super.onDestroyView()
reference?.remove()
reference2?.remove()
}
Комментарии:
1. Этот ответ не имеет ничего общего с вашим реальным вопросом. Исключение NullPointerException , на которое ссылается
listView.Adapter = adapter
, четко указывает, что вашlistView
объект равен нулю.