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
,而不是主线程 iv
是 ImageView
。
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
我对 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
,而不是主线程 iv
是 ImageView
。
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