android doesn't go into the coroutine

Viewed 234

Good afternoon, I ran into the following problem: I'm trying to get a list of stores, but I get null in response. judging by the debag, it does not even go into the coroutine in DataAccessStrategy. A similar piece of code elsewhere in the app works, I can't figure out what the problem is.

LoginViewModel

class LoginViewModel @ViewModelInject constructor(private val remoteDataSource: OrderRemoteDataSource,
                                                  private val ordersRepository: OrdersRepository) :
    ViewModel() {

var shops = ordersRepository.getShops()
    fun showDialog(){
        var shopList: List<Shop>? = shops.value?.data
        var names:List<String?> = shopList!!.map{it.customName}

        MaterialAlertDialogBuilder(LOGIN_ACTIVITY)
                .setTitle("Выбрать магазин")
                .setItems(names.toTypedArray()) { dialog, which ->

                    Log.d("LOGIN VIEW MODEL", "selected")
                }
                .show()
    }

DataAccessStrategy

fun <T, A> performGetOperation(
    databaseQuery: () -> LiveData<T>,
    networkCall: suspend () -> Resource<A>,
    saveCallResult: suspend (A) -> Unit
): LiveData<Resource<T>> =
    liveData(Dispatchers.IO) {
        emit(Resource.loading())
        val source = databaseQuery.invoke().map { Resource.success(it) }
        emitSource(source)

        val responseStatus = networkCall.invoke()
        if (responseStatus.status == SUCCESS) {
            saveCallResult(responseStatus.data!!)

        } else if (responseStatus.status == ERROR) {
            emit(Resource.error(responseStatus.message!!))
            emitSource(source)
        }
    }

OdredsRepository

class OrdersRepository @Inject constructor(
    private val remoteDataSource: OrderRemoteDataSource,
    private val localDataSource: OrdersDao
) {

fun getShops() = performGetOperation(
            databaseQuery = { localDataSource.getAllShops() },
            networkCall = { remoteDataSource.getShops() },
            saveCallResult = { localDataSource.insertShop(it.results) }
    )
}

OrderRemoteDataSource

class OrderRemoteDataSource @Inject constructor(
    private val orderService: OrderService
) : BaseDataSource() {
    suspend fun getShops() = getResult { orderService.getAllShops() }

OrderService

interface OrderService {
    @GET("shops/all")
suspend fun getAllShops(): Response<ResultShops>

    companion object {
        const val MAUMarket_API_URL = "MYURL.com"
    }
}

E/AndroidRuntime: FATAL EXCEPTION: main Process: ru.gkomega.navigation, PID: 4349 java.lang.NullPointerException at ru.gkomega.maumarket.ui.login.LoginViewModel.showDialog(LoginViewModel.kt:36) at ru.gkomega.maumarket.ui.login.LoginFragment$onViewCreated$1.onClick(LoginFragment.kt:50) at android.view.View.performClick(View.java:7259) at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119) at android.view.View.performClickInternal(View.java:7236) at android.view.View.access$3600(View.java:801) at android.view.View$PerformClick.run(View.java:27892) at android.os.Handler.handleCallback(Handler.java:883) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

I will be glad of any help, thanks

1 Answers
private fun obser() {
    mViewModel.shopsLiveData.observe(viewLifecycleOwner, Observer {
        when (it.status) {
            Resource.Status.SUCCESS -> {
                //binding.progressBar.visibility = View.GONE

                main.isRefreshing = false
                if (!it.data.isNullOrEmpty()) Log.i("LEL",it.data.toString())
            }
            Resource.Status.ERROR ->
                Toast.makeText(requireContext(), it.message, Toast.LENGTH_SHORT).show()

            Resource.Status.LOADING -> {
                main.isRefreshing = true
                //binding.progressBar.visibility = View.VISIBLE
            }
        }
    })
}

Try it sample code. May it not better way, but its may be working

Related