我的实时数据正在更新,但没有触发AndroidKotlin中的观察者

zbdgwd5y  于 2023-04-28  发布在  Android
关注(0)|答案(1)|浏览(111)

我有一个livedata变量,我一直在监听我的主活动,以在UI线程中执行一些操作,但不幸的是,它没有被触发。请注意,方法test()是从用于webview通信的Javascript接口调用的。
这是我已经实现的,

  1. class MainViewModel(){
  2. .
  3. .
  4. .
  5. var data = MutableLiveData<String>();
  6. fun test(value: String){
  7. data.value = DataProtocol(
  8. "sample",
  9. arrayOf("CONNECTED")).toString()
  10. }
  11. }

这是我的第一次尝试,但我得到一个错误
java.lang.IllegalStateException:无法在后台线程上调用setValue
接下来我试着这么做

  1. fun test(value: String){
  2. data.postValue(DataProtocol(
  3. "sample",
  4. arrayOf("CONNECTED")).toString())
  5. }

还是没有更新,然后我试着这样做,

  1. fun test(value: String){
  2. viewModelScope.launch {
  3. withContext(Dispatchers.Main) {
  4. data.postValue(DataProtocol(
  5. "sample",
  6. arrayOf("CONNECTED")).toString())
  7. }
  8. }
  9. }

最后我别无选择。
这是我如何从主要活动中听它

  1. this.viewModel.data.observe(this) { d ->
  2. println("RECIEVED DATA " + d)
  3. }

任何想法我做错了什么。我真的很想得到这个从主要活动触发,但不知道为什么这是不工作。任何建议将不胜感激。提前感谢。

ybzsozfc

ybzsozfc1#

您附加了代码的不完整部分,因此很难从这些片段中检测出您所面临的问题。
不过,我已经为您编写了一些工作代码,因此您可以将其与您的代码进行比较,以确定问题所在。希望对您有所帮助。
下面是工作代码:
MainActivity.kt:

  1. package com.example.test
  2. import androidx.appcompat.app.AppCompatActivity
  3. import android.os.Bundle
  4. import android.util.Log
  5. import androidx.lifecycle.ViewModelProvider
  6. class MainActivity : AppCompatActivity() {
  7. private val viewModel by lazy {
  8. ViewModelProvider(this).get(MainViewModel::class.java)
  9. }
  10. override fun onCreate(savedInstanceState: Bundle?) {
  11. super.onCreate(savedInstanceState)
  12. setContentView(R.layout.activity_main)
  13. viewModel.text.observe(this) { text ->
  14. Log.i("TestLog", text)
  15. }
  16. viewModel.updateText("New text")
  17. }
  18. }

MainViewModel.kt:

  1. package com.example.test
  2. import androidx.annotation.MainThread
  3. import androidx.lifecycle.MutableLiveData
  4. import androidx.lifecycle.ViewModel
  5. import androidx.lifecycle.viewModelScope
  6. import kotlinx.coroutines.Dispatchers
  7. import kotlinx.coroutines.launch
  8. import kotlinx.coroutines.withContext
  9. class MainViewModel: ViewModel() {
  10. val text = MutableLiveData<String>("Initial value")
  11. @MainThread
  12. fun updateText(value: String) {
  13. viewModelScope.launch(Dispatchers.IO) {
  14. updateTextInWorkerThread(value)
  15. }
  16. }
  17. private suspend fun updateTextInWorkerThread(value: String) {
  18. withContext(Dispatchers.Main) {
  19. text.value = value
  20. }
  21. }
  22. }

因此,在日志中显示2个字符串:

  1. 2023-04-26 12:52:37.440 7773-7773 TestLog com.example.test I Initial value
  2. 2023-04-26 12:52:37.532 7773-7773 TestLog com.example.test I New text
展开查看全部

相关问题