完成后 Viewmodel 保留数据 activity

Viewmodel preserving data after finishing activity

我有一个 MainActivity 表单,我正在其中打开 CreatePassword Activity,我正在保存密码并完成 CreatePasswordActivity 并将 Intent 发送回 MainActivity.

喜欢MainActivity -----> CreatePassword(Finish) ---Intent----> 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()
        })
    }

但是现在当我从 MainActivity 再次打开 CreatePasswordActivity 时,它是 LiveData 自动发送以前的数据(意图)并且 CreatePasswordActivity 突然结束了。

我实现代码有没有错误?有人知道如何解决这个问题吗?

最后我使用了下面的 class,它帮助我解决了当前的问题,如果我能够找到更好的解决方案,将来会看到并更新答案。

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