Kotlin 契约在错误的线程上成功了吗?

Kotlin kovenant succesUi on wrong thread?

我对 Kovenant 有一个奇怪的问题。要么我不明白某事要么有一些错误。下面的代码是 Android 的简单 task { } successUi { }。然而 succesUi 生成 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.,当检查线程名称时它是:kovenant-callback-2,而不是主线程 ivImageView

    val promesa1 = task {
        val nazwa = Thread.currentThread().name
        print(nazwa)
    } successUi {
        val nazwa = Thread.currentThread().name
        print(nazwa)

        try {
            iv!!.setImageBitmap(null)
        } catch (ex : Exception) {
            print("Mamy:"+ex.toString())
        }
    }

您必须在 MainActivity 上调用 startKovenant()(和 stopKovenant())。这将通过保持线程活动并将适当的调度程序附加到 UI 回调来设置 Kovenant 以与 Android 一起使用。

所以像这样:

public class MainActivity : ... {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(...)

        // Configure Kovenant with standard dispatchers
        startKovenant()

    }

    ...

    override fun onDestroy() {
        stopKovenant()
        super.onDestroy()
    }
}

有关此主题的更多信息,请参见 Android configuration documentation