观察 MediatorLiveData 不会产生任何结果(附加观察者)

时间:2021-01-22 05:34:16

标签: android mvvm retrofit dagger mediatorlivedata

基本上,我使用 Retrofit 从 this API 获取产品列表到 ProductsRepository 类中的 MediatorLiveData。但是,问题是,当我尝试观察 LiveData 时,我得到了 null。

这是我的代码片段:

产品存储库:

@MainScope
class ProductsRepository @Inject constructor(private val productsApi: ProductsApi) {

    private val products: MediatorLiveData<ProductsResource<List<ProductsModel>>> =
        MediatorLiveData()


    fun getProducts(): LiveData<ProductsResource<List<ProductsModel>>> {

        products.value = ProductsResource.loading(null)

        val source: LiveData<ProductsResource<List<ProductsModel>>> =
            LiveDataReactiveStreams.fromPublisher {

                productsApi.getProducts()
                    .onErrorReturn {
                        val p = ProductsModel()
                        p.setId(-1)
                        val products = ArrayList<ProductsModel>()
                        products.add(p)
                        products
                    }.map {
                        if (it[0].getId() == -1) {
                            ProductsResource.error("Something went wrong", null)
                        }
                        ProductsResource.success(it)
                    }.observeOn(Schedulers.io())
            }



        products.addSource(source){
            products.value = it
            products.removeSource(source)
        }

        return products

    }

} 

主视图模型

class MainViewModel @Inject constructor(private val repository: ProductsRepository): ViewModel() {

    fun getProducts(): LiveData<ProductsResource<List<ProductsModel>>>{
        return repository.getProducts()
    }

}

主要活动:

class MainActivity : DaggerAppCompatActivity() {

    lateinit var binding: ActivityMainBinding

    @Inject
    lateinit var viewModelProviderFactory: ViewModelProviderFactory

    lateinit var mainViewModel: MainViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        initViewModel()

        subscribeToObservers()

    }

    private fun subscribeToObservers(){
        mainViewModel.getProducts()
            .observe(this){
                Log.d("", "subscribeToObservers: "+ it.data?.size)
            }
    }

    private fun initViewModel() {
        mainViewModel = ViewModelProvider(this, viewModelProviderFactory).get(MainViewModel::class.java)
    }

}

如果我调用 hasActiveObservers(),它会返回 false,尽管我是从 MainActivity 观察它的。

现在,假设我用 MutableLiveData 替换 MediatorLiveData 并像下面这样重构我的 ProductsRepository,我得到了预期的输出。

fun getProducts(): LiveData<ProductsResource<List<ProductsModel>>> {
    val products: MutableLiveData<ProductsResource<List<ProductsModel>>> = MutableLiveData()
    products.value = ProductsResource.loading(null)

    productsApi.getProducts()
        .onErrorReturn {
            //Log.d("MyError", it.message.toString())
            val p = ProductsModel()
            p.setId(-1)
            val product = ArrayList<ProductsModel>()
            product.add(p)
            product
        }.map { product ->
            if (product.isNotEmpty()) {
                if (product[0].getId() == -1) {
                   // Log.d("Map", "Error: ${product}")
                    ProductsResource.error(
                        "Something went Wrong",
                        null
                    )
                }
            }

            ProductsResource.success(product)

        }.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe {
            products.value = it
        }


    return products
}

我不知道我是否成功地解释了我的问题。如果我需要提供更多详细信息或代码片段,请告诉我。

提前致谢

0 个答案:

没有答案
相关问题