如何解决错误:使用 RX java 在实现室中“不确定如何处理插入方法的返回类型”

Posted

技术标签:

【中文标题】如何解决错误:使用 RX java 在实现室中“不确定如何处理插入方法的返回类型”【英文标题】:How to solve error : " Not sure how to handle insert method's return type" in implement room with RX java 【发布时间】:2019-11-20 02:36:20 【问题描述】:

这是我在运行我使用RoomRX java 开发的示例项目后出现的错误:

e: /home/milad/workspace/android/WalletMVVM/app/build/tmp/kapt3/stubs/debug/com/example/walletmvvm/data/dao/CurrencyDao.java:15: error: Not sure how to handle insert method's return type.
    public abstract io.reactivex.Single<com.example.walletmvvm.data.model.CurrencyModel> insert(@org.jetbrains.annotations.NotNull()

我搜索了很多,但我没有找到任何东西。

我可以用RX java 实现Retrofit 并使用它,我可以用RX java 在其他线程中运行Room 查询,但我不能用@ 设置observersubscribe observable 987654334@还没有。

一切都很好

这是我的Dao

@Dao
interface CurrencyDao 

        @Query("SELECT * FROM $DbConstants.TABLE_CURRENCY ORDER BY $DbConstants.NAME_CURRENCY_MODEL ASC")
        fun getCurrencyList(): Observable<List<CurrencyModel>>

        @Insert(onConflict = OnConflictStrategy.REPLACE)
        fun insert(currencyModel: CurrencyModel): Single<CurrencyModel>
    

这是我的repository

companion object 

    // For Singleton instantiation
    @Volatile
    private var instance: CurrencyRepository? = null

    fun getInstance(currencyDao: CurrencyDao) =
        instance ?: synchronized(this) 
            instance ?: CurrencyRepository(currencyDao).also  instance = it 
        


fun getCurrencyList(): Observable<List<CurrencyModel>>? 

    return currencyDao.getCurrencyList()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())


这是我的fragment 那我observer 的数据:

private fun initObservers() 
    val getCurrencyListObserver = currencyViewModel.getCurrencyLists()
    getCurrencyListObserver?.subscribeWith(getCurrenciesFromDatabase())


private fun getCurrenciesFromDatabase() : Observer<List<CurrencyModel>> 


    return object : Observer<List<CurrencyModel>> 
        override fun onComplete() 

        

        override fun onSubscribe(d: Disposable) 

        

        override fun onNext(t: List<CurrencyModel>) 

            t.let 

                showResult(it.size.toString() + " items")
                setRecyclerData(it)
                binding.listSize = it.size
            
        

        override fun onError(e: Throwable) 

        
    

为了实现这一点,我研究了this in medium 并研究了this

我在googlesamples/android-architecture-components 看到了关于 Kotlin 的示例代码,但他们不使用观察者


更新:

因为在那之后我删除了single 我无法使用:

currencyDao.insert(currency)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe()

currencyDao.insert(currency)无法访问.subscribeOn()


更新:

当我将返回类型更改为Long 类型时我解决了这个问题,但我遇到了新的error

 @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(currencyModel: CurrencyModel): Single<Long>

新的错误是:

e: /home/milad/workspace/android/WalletMVVM/app/build/tmp/kapt3/stubs/debug/com/example/walletmvvm/data/dao/CurrencyDao.java:11: error: Not sure how to convert a Cursor to this method's return type (java.lang.Object).
    public abstract io.reactivex.Observable<java.lang.Object> getCurrencyList();

更新:

我将 insert 返回类型更改为 Completable 并修复了

【问题讨论】:

为什么你的插入返回Single&lt;CurrencyModel&gt; @Blackbelt,我把它改成了 Maybe 和 Observable 但我又遇到了那个错误!! 为什么要退货? @Blackbelt,我更新了我的问题,因为我希望插入返回,但是当我将返回类型更改为 Long 类型时我解决了它,但我遇到了新错误 你可以使用Single.fromCallable 并让insert什么都不返回? 【参考方案1】:

你的:

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(currencyModel: CurrencyModel): Single<CurrencyModel>

应该返回 Completable 而不是 Single

        @Insert(onConflict = OnConflictStrategy.REPLACE)
        fun insert(currencyModel: CurrencyModel): Completable

那是因为你的操作完成后不需要返回任何东西。它只是进入背景上的onComplete 块。

【讨论】:

返回 Completable 而不是 Single 是的,谢谢,但它解决了我的第一个问题我更新了我的问题,我有新的错误 我在您的更新中没有看到 Completable 关键字

以上是关于如何解决错误:使用 RX java 在实现室中“不确定如何处理插入方法的返回类型”的主要内容,如果未能解决你的问题,请参考以下文章

如何实现一个“更好的”Finally Rx 操作符?

静态成员 rx 不能在实例类型 UICollectionView 上使用

如何使用rx-java尾部文件?

获取 Agora.io 语音讨论室中未发布流的用户列表

如何使用 Rx.Net 实现状态轮询?

导入开源库 java.lang.NoClassDefFoundError: rx.plugins.RxJavaPlugins