Я пытаюсь использовать область действия MainScope()
. Я думал, что это позволило мне просто вызывать launch
всякий раз, когда мне нужна новая сопрограмма с возможностью указать, какой диспетчер я хочу, чтобы он запускался, если я не хочу его на Dispatchers.Main. Однако некоторые из моих вызовов launch
вообще не выполняются.
- Этот код сначала извлекает значение db настройки из Room.
- Когда нажимается переключатель предпочтений, он выполняет сетевой запрос на запись новой настройки на сервере.
Если ответ успешен, я хочу обновить значение локальной базы данных в комнате. Второй запуск в пределах наблюдаемого ответа никогда не выполняется. Без вызова запуска мне (правильно) сказал Room не писать в основной теме.
class PrefsFragment : PreferenceFragmentCompat(), Injectable, CoroutineScope by MainScope() {
@Inject
lateinit var settings: BranchSettingsRepository
@Inject
lateinit var preferencesHelper: PreferencesHelper
var groupID = 0
var branchID = 0
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.preferences, rootKey)
}
override fun onViewCreated(view: View, @Nullable savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
groupID = preferencesHelper.merchantGroupID.toInt()
branchID = preferencesHelper.merchantBranchID.toInt()
createAutoAcceptSetting(view)
}
private fun createAutoAcceptSetting(root: View) {
launch(Dispatchers.IO) {
val setting = settings.getSettingByName(preferencesHelper.merchantBranchID, AUTO_ACCEPT)
if (setting != null) {
val preference = findPreference<SwitchPreferenceCompat>(AUTO_ACCEPT)
preference?.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { pref, newValue ->
var valueAsIntString = "0"
if (newValue as Boolean) {
valueAsIntString = "1"
}
updateSetting(groupID, branchID, setting.id, valueAsIntString)
.observe(viewLifecycleOwner, Observer { response ->
response?.let {
if (it.status == Status.SUCCESS) {
Timber.i("New setting updated (old value was: $setting)")
Timber.i("launching db write with value: $valueAsIntString")
launch(Dispatchers.IO) {
//This code is never executed
setting.value = valueAsIntString
Timber.i("writing new setting: $setting")
settings.insertSetting(setting)
}
}
}
})
true
}
}
}
}
override fun onDestroy() {
super.onDestroy()
cancel()
}
}