Lena
Lena

Reputation: 561

Observer pattern is not working in Android MVVM

I am trying to update my view according to my data in my ViewModel, using MVVM I need in the method onCacheReception to update my map whenever zones is changing

ViewModel

class MainViewModel constructor(application: Application) : AndroidViewModel(application),
    CacheListener {

    private val instance = Initializer.getInstance(application.applicationContext)
    private val _zones = MutableLiveData<List<Zone>>()
    val zones: LiveData<List<Zone>>
        get() = _zones

    init {
        CacheDispatcher.addCacheListener(this)
    }

    override fun onCacheReception() {
        val zonesFromDB: List<Zone>? = instance.fetchZonesInDatabase()

        _zones.value = zonesFromDB
    }
}

MainActivity

class MainActivity : AppCompatActivity(), EasyPermissions.PermissionCallbacks, OnMapReadyCallback {
    private val mainViewModel: MainViewModel = ViewModelProvider(this).get(MainViewModel(application)::class.java)
    private lateinit var initializer: Initializer

    private lateinit var map: GoogleMap

    private val REQUEST_CODE_LOCATIONS: Int = 100
    private val permissionLocationsRationale: String = "Permissions for Fine & Coarse Locations"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (checkForLocationsPermission()) {
            setUp()
            mapSetUp()
        }

        mainViewModel.zones.observe(this, Observer { zones ->
            zones.forEach {
                Log.i("YES DATA", "Data has been updated")
                val latLng = it.lat?.let { it1 -> it.lng?.let { it2 -> LatLng(it1, it2) } }
                val markerOptions = latLng?.let { it1 -> MarkerOptions().position(it1) }
                map.addMarker(markerOptions)
            }
        })
    }

My Log is never displaying and it doesn't seem while debugging that mainView.zones.observe { } is called when I receive some new data in my ViewModel

Upvotes: 1

Views: 536

Answers (1)

matteoh
matteoh

Reputation: 3590

In the onCacheReception(), replace:

_zones.value = zonesFromDB

by:

_zones.postValue(zonesFromDB)

in case your onCacheReception() function is called from a worker thread.

Upvotes: 3

Related Questions