Viewmodel сохранение данных после завершения деятельности - PullRequest
0 голосов
/ 29 марта 2020

У меня есть форма MainActivity, в которой я открываю CreatePassword Activity, в которой я сохраняю пароль и, наконец, sh CreatePasswordActivity с отправкой Intent обратно в MainActivity.

Как и MainActivity ----- > CreatePassword (Fini sh) --- Намерение ----> MainActivity

  private fun observeIntentResult() {
        generatePasswordViewModel.getIntentResult().observe(this@CreatePasswordActivity, androidx.lifecycle.Observer { intent ->
            Toast.makeText(this, "Got Same Data", Toast.LENGTH_SHORT).show()
            setResult(Activity.RESULT_OK, intent)
            finish()
        })
    }

Но теперь, когда я снова открываю CreatePasswordActivity из MainActivity, это LiveData автоматически отправляет предыдущие данные (намерение) и CreatePasswordActivity внезапно завершена.

Есть ли у меня ошибки при реализации кода? Кто-нибудь есть идеи, как решить эту проблему?

1 Ответ

0 голосов
/ 29 марта 2020

Наконец, я воспользовался приведенным ниже классом, который помог мне решить текущую проблему, увидит и обновит ответ в будущем, если мне удастся найти какое-либо лучшее решение.

open class VolatileLiveData<T> : MutableLiveData<T>() {
    private val lastValueSeq = AtomicInteger(0)
    private val wrappers = HashMap<Observer<in T>, Observer<T>>()

    @MainThread
    public override fun setValue(value: T) {
        lastValueSeq.incrementAndGet()
        super.setValue(value)
    }

    @MainThread
    public override fun observe(owner: LifecycleOwner, observer: Observer<in T>) {
        val observerWrapper = ObserverWrapper(lastValueSeq, observer)
        wrappers[observer] = observerWrapper
        super.observe(owner, observerWrapper)
    }

    @MainThread
    public override fun observeForever(observer: Observer<in T>) {
        val observerWrapper = ObserverWrapper(lastValueSeq, observer)
        wrappers[observer] = observerWrapper
        super.observeForever(observerWrapper)
    }

    @MainThread
    public override fun removeObserver(observer: Observer<in T>) {
        val observerWrapper = wrappers[observer]
        observerWrapper?.let {
            wrappers.remove(observerWrapper)
            super.removeObserver(observerWrapper)
        }
    }
}

private class ObserverWrapper<T>(private var currentSeq: AtomicInteger, private val observer: Observer<in T>) : Observer<T> {
    private val initialSeq = currentSeq.get()
    private var _observer: Observer<in T> = Observer {
        if (currentSeq.get() != initialSeq) {
            // Optimization: this wrapper implementation is only needed in the beginning.
            // Once a valid call is made (i.e. with a different concurrent sequence), we
            // get rid of it any apply the real implementation as a direct callthrough.
            _observer = observer
            _observer.onChanged(it)
        }
    }

    override fun onChanged(value: T) {
        _observer.onChanged(value)
    }
}
...