从Kotlin的非UI线程编辑实时数据

问题描述 投票:0回答:2

我正在设计一个具有蓝牙连接的应用程序,用于显示从BT接收到的某些数据。我想使用androids LiveData在布局和类之间进行通信。

我有一个专用(非UI)线程,用于管理与负责接收和发送数据的蓝牙适配器的连接。我现在遇到一个问题,因为我无法从该线程编辑LiveData。我有以下代码用于编辑LiveData

class ConnectThread(device: BluetoothDevice): Thread()
{
 ...
 private lateinit var model: MainViewModel
 override fun run() {
       model = ViewModelProviders.of(this).get(MainViewModel::class.java)
       model.frontleft.postValue("hello")
    ...
    }
 }

我可以使用布局(UI)在活动中使用上层代码编辑LiveData,没有问题。但是在我的Connect线程中,我在模型代码的.of(this)部分收到以下错误:error .of

这是我的ViewModel

class MainViewModel : ViewModel() {
   val frontleft: MutableLiveData<String> by lazy {
       MutableLiveData<String>()
   }
}

我对我的问题进行了相当多的研究,但找不到答案。是因为我要从非UI线程/框架/活动中编辑LiveData吗?还是因为线程在代码的不同部分上运行?

android multithreading kotlin viewmodel android-livedata
2个回答
0
投票

这指向当前的context,因此,如果您的代码位于片段或活动中,则可以像contextthis@YourFragmentName一样访问它的this@YuorActivityName,也可以选中ViewModelProviders documentation

[ViewModelProviders.of(this).get(MainViewModel::class.java)更改此处]


0
投票

ViewModelProviders.of(this).get(model :: class.java)在内部使用keepFragment。您需要以某种方式将值发送给构造函数,或者设置一个公共的可观察属性以从线程设置属性并在视图模型中使用该属性。

var myObservable by Delegates.Observables(""){_,_,_ -> "hello"}

类似的东西

© www.soinside.com 2019 - 2024. All rights reserved.