В моем приложении в Android я читаю данные из базы данных реального времени Firebase и использую их для установки маркеров в представлении моей карты Google.
Кроме того, я прохожу онлайн-курс по разработке Android и узнал о ViewModel .
У меня вопрос : Когда я читаю данные, я должен сохранить их в подклассе ViewModel , чтобы я прочитал данные один раз?
Пока я читаю данные каждый раз, когда вызывается my MapsActivity и добавляются маркеры на карту.
Функция чтения данных в Класс базы данных :
fun readFromDatabase(type: String, callBack: OwnerListCallBack) {
when (type) {
OWNERS -> {
ownerRef.addValueEventListener(object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
// This method is called once with the initial value and again
// whenever data at this location is updated.
for (snapshot: DataSnapshot in dataSnapshot.children) {
val owner = snapshot.getValue(Owner::class.java)
Log.d(TAG, "readFromDatabase: onDataChange: owner's name is ${owner?.name}")
if (owner != null)
owners.add(owner)
Log.d(TAG, "readFromDatabase: onDataChange: owner's name is ${owners[0].name}")
}
callBack.onCallBack(owners)
}
override fun onCancelled(error: DatabaseError) {
// Failed to read value
Log.w(TAG, "Failed to read value.", error.toException())
}
})
}
устанавливает маркеры, которые вызывается на onMapReady функция на MapsActivity класс :
private fun setRestaurantsOnMap() {
val marker = BitmapDescriptorFactory.fromResource(R.drawable.twotone_local_cafe_white_18dp)
val context = this
Log.d(TAG, "setRestaurantsOnMap: called")
// Set markers on the map. The owner's restaurants.
database.readFromDatabase(OWNERS, object: OwnerListCallBack {
override fun onCallBack(owners: ArrayList<Owner>) {
if (owners.isNotEmpty()) {
for (owner in owners) {
try {
val ownerAddress = owner.getRestaurant().getAddress()
Log.d(TAG, "setRestaurantsOnMap: owner's address is: ${ownerAddress.getAddress()}")
val latlng = getLocationFromAddress(context, ownerAddress.getAddress())
Log.d(TAG, "setRestaurantsOnMap: latitude is - ${latlng?.latitude}, longitude is - ${latlng?.longitude} ")
if (latlng != null) {
mMap.addMarker(MarkerOptions()
.position(latlng)
.title(owner.getRestaurant().getName())
.snippet(owner.getRestaurant().getAddress().getAddress())
.icon(marker)
)
mMap.moveCamera(CameraUpdateFactory.newLatLng(latlng))
} else {
Log.d(TAG, "setRestaurantsOnMap: latlng is null")
}
} catch (e: NullPointerException) {
e.printStackTrace()
} catch (e: IndexOutOfBoundsException) {
e.printStackTrace()
}
}
}
}
})