android - Android - 使用 Flow 创建回调
问题描述
我正在尝试理解 Flow,但对我来说几乎没有什么不清楚的。我有一个简单的界面:
interface Operation<T> {
fun performAsync(callback: (T? , Throwable?) -> Unit)
fun cancel()
}
然后我有一个具有功能的管理器类:
fun<T : Any> Operation<T>.perform(): Flow<T> =
callbackFlow {
performAsync {
value , exception ->
when {
exception !=null -> close(exception) //operation had failed
value == null -> close() //operation had succeeded
else -> offer(value as T)
}
}
awaitClose { cancel() }
}
假设我有一个非常简单的操作 - 尝试使用 gson 将对象序列化为 JSON:
fun convert () {
try {
val carJSON = gson.toJson(carObj)
//send Car value
} catch (e : Exception) {
//here I want to send exception and receive it in callback in activity/fragment.
}
}
请您解释一下,如何观察异常(或 T 值)并在 Activity/Fragment 中发送/接收它?
解决方案
您如何使用密封类。
sealed class Operation<out V, out E> {
data class Result<out V> (val data: V) : Operation<V, Nothing>()
data class Error<out E> (val error: E) : Operation<Nothing, E>()
companion object {
inline fun <V> build(operation : () -> V) : Response<V, Exception> {
return try {
Value(operation.invoke())
} catch (e: Exception) {
Error(e)
}
}
}
然后,当您需要某个回调函数作为流程的响应时,请执行以下操作。
fun someFunction() : Operation<Flow<String>, Exception> {
val flow = callbackFlow<String> {
val callback = object : someCallback {
onResult(result: String) {
offer(result)
}
onError(e: Exception) {
throw e
}
}
awaitClose { callback.remove() } //Just an example of a callback
}
return Operation.build { flow }
}
现在在活动中,
只需通过某种方法获得结果,例如,
when(someFunction) {
is Operation.Result -> collect(someFunction().data)
is Operation.Error -> handleErrorAsHoweverYouWant(someFunction().error)
}
推荐阅读
- excel - 比较从 Selection 中检索到的形状对象和从 ActiveSheet.Shapes 集中检索到的相同形状
- vba - 如何获得一组形状以根据选择的形状更改颜色?
- c# - C#检查按钮是否被第二次点击
- docker - 各种 Minikube + Kubernetes IP 地址有什么区别?
- php - 从子类动态设置类
- flutter - Flutter SliverPersistentHeader 导致“滚动时底部溢出”
- html - 通过堆叠html元素生成一个简单的十字架
- google-apps-script - 如何仅从范围中获取过滤后的值?
- ruby-on-rails - 每当 gem 出现在本地时,我都会遇到问题
- ios - 从文本字段在 tableView 中添加新单元格