如何简单地用RX /协程替换android AsyncTask并返回一个值?

时间:2019-07-11 07:36:05

标签: android android-asynctask rx-java2 android-room kotlin-coroutines

此方法运行数据库操作(返回生成的ID),并且必须在后台线程上:

fun insert(note: Note): Long{ return noteDao.insert(note) }

是否可以使用RX /协程实现它? (不使用suspend关键字)

我当前正在使用AsyncTask:

override fun insert(note: Note): Long {
    return InsertTask(this, noteDao).execute(note).get()
}

private class InsertTask(noteRepository: NoteRepository, private val noteDao: NoteDao) : AsyncTask<Note, Void, Long>() {

    override fun doInBackground(vararg note: Note): Long {
        return noteDao.insert(note[0])
    }

    override fun onPostExecute(generatedId: Long) {
        getTheId(generatedId)
    }

    private fun getTheId( id: Long): Long {
        return id
    }
}

2 个答案:

答案 0 :(得分:0)

使用协程,非常简单。但是您将需要针对Room的协程支持。

等级依赖性:

implementation "androidx.room:room-ktx:2.1.0"

接下来,将dao中的方法标记为暂停。

@Insert
suspend fun insert(note: Note): Long

我不知道您有多少有关协程的信息,但是它像这样:

aCoroutineScope.launch(Dispatchers.IO){
 //to make analogy you are inside the do in backgroun here
  val id = dao.insert(note)
  withContext(Dispatchers.Main){
  //oh well you can call this onPostExecute :) 
  //do whatever you need with that selectId here
  handleIdOnTheMainThread(id)
  }
}

但是我确实坚持不将它与0有关协程的信息一起使用。

关于RxJava:

Room也支持Rx,因此请参考this link

答案 1 :(得分:0)

简单的接收方式(如coroutineDispatcher提到的链接here),我使用了Completable的return val:

@Insert(onConflict = OnConflictStrategy.REPLACE) fun insert(note: Note): Completable

在视图层中,我们使用

插入

                repoViewModel.insert(currentNote)
                    .subscribeOn(Schedulers.io())
                    .subscribe()

依赖性:

annotationProcessor 'androidx.room:room-compiler:2.2.0-alpha01'
implementation 'androidx.room:room-runtime:2.2.0-alpha01'
implementation "android.arch.persistence.room:rxjava2:1.1.1"
implementation 'androidx.room:room-rxjava2:2.2.0-alpha01'
implementation "android.arch.persistence.room:runtime:1.1.1"
implementation "androidx.room:room-ktx:2.1.0"
kapt 'androidx.room:room-compiler:2.2.0-alpha01'
kapt "android.arch.persistence.room:compiler:1.1.1"

implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'io.reactivex.rxjava2:rxjava:2.2.9'
implementation 'io.reactivex.rxjava2:rxkotlin:2.2.0'