Android 从kotlin中的非UI线程编辑livedata
我正在设计一个带有蓝牙连接的应用程序,用于显示从BT接收到的一些数据。我想使用androidsAndroid 从kotlin中的非UI线程编辑livedata,android,multithreading,kotlin,viewmodel,android-livedata,Android,Multithreading,Kotlin,Viewmodel,Android Livedata,我正在设计一个带有蓝牙连接的应用程序,用于显示从BT接收到的一些数据。我想使用androidsLiveData在布局和类之间进行通信 我有一个专用(非UI)线程,用于管理与蓝牙适配器的连接,该适配器负责接收和发送数据。我现在有一个问题,因为我无法从该线程编辑LiveData。我有以下用于编辑LiveData的代码: class ConnectThread(device: BluetoothDevice): Thread() { ... private lateinit var model:
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")
...
}
}
我可以编辑LiveData
,在我的活动中使用上面的代码,布局(UI)没有问题。但是在我的连接线程中,我在模型代码的(this)
部分得到了以下错误:
这是我的视图模型
:
class MainViewModel : ViewModel() {
val frontleft: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
}
class MainViewModel:ViewModel(){
val frontleft:lazy提供的可变LiveData{
MutableLiveData()
}
}
我对我的问题做了相当多的研究,但找不到答案。是因为我想从非UI线程/碎片/活动编辑LiveData吗?或者因为线程运行在代码的不同部分?这指向当前的
上下文
,因此如果您的代码处于片段或活动中,您可以像这样访问它的上下文
this@YourFragmentName,this@YuorActivityName
您还可以检查ViewModelProviders
ViewModelProviders.of(this.get)(MainViewModel::class.java)
在这里更改此设置ViewModelProviders.of(this.get)(model::class.java)在内部使用一个retainFragment。您需要以某种方式将该值发送给构造函数,或者设置一个公共的可观察属性,以从线程设置一个属性,并在viewmodel中使用该属性
var myObservable by Delegates.Observables(“”{{uu,{uu,{uu->“hello”}
类似这样的内容在此@之后我应该添加哪些活动名称?在中创建ViewModel的视图或?所以我需要做:
model=ViewModelProviders.of(this@activity).get(MainViewModel::class.java)
yes与ViewModel
关联的那一个,因此我有一个文件“BluetoothService.kt”,其中有函数class ConnectThread…
和class MainViewModel
。。。但无法访问它。它不使用保留片段,因为您不需要扩展LifecycleActivity
。它使用非配置实例。