【问题标题】:How to stop observing liveData in the start of activity lunch?如何在活动午餐开始时停止观察 liveData?
【发布时间】:2019-12-08 16:49:03
【问题描述】:

我有一个具有 ViewModel 的活动,并且该活动观察 ViewModel 的 liveData 当我第一次开始活动时,它可以工作,但是当我再次返回它时,我需要像新的一样,但由于它仍在观察 liveDatas ,它会向我显示旧数据。我该怎么办? (哦,请记住,我无法创建新活动)

这是我的活动

class LoginActivity : AppCompatActivity() {

lateinit var idEditText: EditText

lateinit var createAccountTextView: TextView


lateinit var loginButton: Button

private lateinit var userRepository: UserRepository

private lateinit var loginActivityViewModel: LoginActivityViewModel


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_login)

    userRepository = UserRepository(application)

    loginActivityViewModel = ViewModelProviders.of(
        this,
        LoginActivityViewModelFactory(userRepository)
    ).get(LoginActivityViewModel::class.java)


    idEditText = findViewById(R.id.idEditText)
    loginButton = findViewById(R.id.enterButton)
    createAccountTextView = findViewById(R.id.createAccountTextView)

    loginButton.setOnClickListener {

        val loginID = idEditText.text.toString()

        loginActivityViewModel.userEntry(loginID)


    }
    createAccountTextView.setOnClickListener {

        val createAccountIntent = Intent(this, CreateAccountActivity::class.java)

        startActivity(createAccountIntent)

        finish()


    }

}

override fun onResume() {
    super.onResume()

    loginActivityViewModel.idEditTextMutableLiveData.observe(this, Observer {

        idEditText.error = it

    })

    loginActivityViewModel.onSuccessMutableLiveData.observe(this, Observer {

            val mainIntent = Intent(this, MainActivity::class.java)

            mainIntent.putExtra(loginValue, UserUI(it.username, it.userId.toInt()))

            startActivity(mainIntent)

    })


}

}

【问题讨论】:

  • 添加您目前尝试过的内容

标签: java android android-studio kotlin mvvm


【解决方案1】:

使用 Livedata 的目的是获取数据源的最新更新。如果您的数据源是持久的,则意味着返回的数据将始终相同。

您需要做的是在应用程序/活动启动时清除数据源。然后,您可以随时填充数据源。

只要数据源有数据,Livedata 就会一直返回数据。

一种解决方法是完全避免返回 livedata 对象,而只返回对象本身。

【讨论】:

  • 我或多或少会说同样的话。 RXJava 为不同类型的观察者提供了选项来处理这样的事情。如果您愿意,您可以轻松地在简历中设置所需的初始值。我不相信这会是反 MVVM 模式,因为 UI 事件可以将数据发送到 ViewModel。而返回activity就是一个UI事件
猜你喜欢
  • 2018-09-24
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 2019-08-04
  • 2018-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多