Запуск CoroutineScope от MainScope () не выполняется - PullRequest
1 голос
/ 03 апреля 2020

Я пытаюсь использовать область действия 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()
    }
    

    }

...