VictorPower
@VictorPower

Почему coroutine не принимает параметры функции, если использовать Dispatchers.IO?

Пересоздал логику своего приложения, чтобы все тяжелые задачи выполняли корутины в соответствии с мануалом гугла. Но возникла проблема: перестали выполняться операции, которые я направляю в корутину через ViewModel. Если убрать отовсюду suspend-ы и их выполнение в viewModelScope, то все работает.
Вот так направляю данные во ViewModel:
MainActivity
mainViewModel.deleteNotes(selectedIdItems)

Вот так выглядит корутинная функция получатель во ViewModel:
mainViewModel
fun deleteNotes(list: List<Long>) = viewModelScope.launch(Dispatchers.Main) {
    repository.deleteNotes(list)
}

Репозиторий
suspend fun deleteNotes(list: List<Long>) {

    var note: Notes
    list.forEach {
        note = getNote(it)
        notesDao.delete(note)
    }

}

DAO
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(notes: Notes)

Если Dispatchers.IO сменить на Dispatchers.Unconfined, то все работает.
У кого-нибудь есть идеи насчет проблемы?
  • Вопрос задан
  • 84 просмотра
Решения вопроса 1
VictorPower
@VictorPower Автор вопроса
Нашел решение сам.
Корутина, как и фрагменты, не может принимать на вход коллекции данных, лишь примитивы(Int, String и т.д.). Поэтому этот код
MainActivity
mainViewModel.deleteNotes(selectedIdItems)

mainViewModel
fun deleteNotes(list: List<Long>) = viewModelScope.launch(Dispatchers.Main) {
    repository.deleteNotes(list)
}

превратился в такой:
MainActivity
mainViewModel.deleteNotes(TypeConverter.listLongToString(selectedIdItems))

mainViewModel
fun deleteNotes(list: String) = viewModelScope.launch(Dispatchers.IO) {
    repository.deleteNotes(TypeConverter.stringToListLong(list))
}

P.S. TypeConverter - мой собственный класс конвертер.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
21 окт. 2020, в 13:40
35000 руб./за проект
21 окт. 2020, в 13:24
700 руб./за проект