【问题标题】:Initializing IsolatedState results in IllegalStateException初始化 IsolatedState 导致 IllegalStateException
【发布时间】:2021-10-08 05:54:00
【问题描述】:

我正在尝试在我的项目中使用来自StatelyIsolatedState。例如。我有一个视图模型,其中包含一些要显示的数据结构。它使用该数据结构实例进行初始化,然后我尝试创建一个 IsolatedState 以便能够应用用户操作和 bg 操作来改变来自不同线程的相同实例。

class ViewModel() {

    constructor(data: SomeData) : this() {
        println("Hey: ${data.isFrozen}")
        println(1)
        isolatedData = IsolateState { data }
        println(2)
    }

    lateinit private var isolatedData: IsolateState<SomeData>

}

输出是

Hey: false
1

然后引发异常kotlin.IllegalStateException: Mutable state shouldn't be frozen。所以看起来data在初始化IsolatedState之前没有被冻结。我初始化它的方式有问题吗?

【问题讨论】:

    标签: kotlin concurrency kotlin-coroutines kotlin-multiplatform kotlin-native


    【解决方案1】:

    我初始化它的方式有问题吗?

    是的。 IsolateState 的构造函数采用生产者 lambda。该 lambda 应该返回一些可变的数据(即未冻结)。 lambda 本身在另一个线程中运行,该线程由管理IsolateState 的运行时控制。需要冻结该 lambda 才能在该线程上运行,该线程会冻结 data

    为此,它需要看起来更像以下内容:

        constructor(id: Int) : this() {
            isolatedData = IsolateState { SomeData(id) }
        }
    

    lambda 基本上需要创建可变类实例。您不能将可变数据传递到IsolateState 的实例中。生产者 lambda 需要创建它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-21
      相关资源
      最近更新 更多