【问题标题】:Android - create callback using FlowAndroid - 使用 Flow 创建回调
【发布时间】:2020-11-23 09:43:37
【问题描述】:

我正在尝试理解 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 中发送/接收它?

【问题讨论】:

    标签: android kotlin-coroutines kotlin-flow


    【解决方案1】:

    你用一个密封的类怎么样。

    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)
    
    }
    

    【讨论】:

      猜你喜欢
      • 2019-11-01
      • 2019-07-28
      • 2019-10-29
      • 2015-03-19
      • 2018-12-26
      • 2017-04-12
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多