Как просто заменить Android AsyncTask на RX / Coroutines и вернуть значение? - PullRequest
0 голосов
/ 11 июля 2019

этот метод запускает операцию базы данных (возвращает сгенерированный идентификатор) и должен быть в фоновом потоке:

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

Есть ли способ реализовать это с помощью RX / Coroutines? (без использования ключевого слова 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
    }
}

1 Ответ

1 голос
/ 11 июля 2019

С сопрограммами это довольно просто. Но вам потребуется поддержка сопрограмм для Room.

Зависимость Gradle:

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)
  }
}

Но я настаиваю на том, чтобы не использовать его с нулевой информацией о сопрограммах.

О RxJava:

Комната также поддерживает Rx, поэтому, пожалуйста, обратитесь к этой ссылке .

...