Android:异步回调

Posted

技术标签:

【中文标题】Android:异步回调【英文标题】:Android : Async Callback 【发布时间】:2020-04-30 23:37:51 【问题描述】:

如何实现返回回调对象的方法,这样我就可以像这样在回调中得到结果

resultObj.onSuccess()
.onFailure()

我知道我可以通过在接口中定义事件方法来实现这种行为,如下面的代码

val obj = CustomObj()

obj.addOnSuccessListener(object: CustomObjListener 
@Override
fun onSuccess()

)

请告知是否有可能实现或分享您的想法

我想实现react-native中networking api做的过程,

https://facebook.github.io/react-native/docs/network

fun getResult()
    val promise =  fetch('https://facebook.github.io/react-native/movies.json')
return promise



val promise = getResult

  promise.then((response) => response.json())  
        .then((responseJson) => 
          return responseJson.movies;
        )
        .catch((error) => 
          console.error(error);
        );

类似于 javascript 中的 promise 概念。

【问题讨论】:

请详细说明您的问题并解释您的总体目标,并添加一些您检查过的示例代码或文档 如果我理解正确,你想设置 onSuccessonFailure 回调背靠背...告诉我如果我错了... @HarshvardhanJoshi 正确!但需要从方法返回值处理,一个类有多个方法都需要实现相同的行为 【参考方案1】:

如果你想像你更新的javascript示例那样设置回调,你需要使用Future API来实现与javascript示例相同的回调链。

Futurekotlin/java/dart 等价于 JS 中的Promise

但是在 kotlin 中,FuturePromisecoroutine 都可用。 建议使用 coroutines 以获得相同的结果。

您可以参考这些文章了解更多详情:

https://kotlinlang.org/docs/tutorials/coroutines/async-programming.html https://medium.com/@elizarov/futures-cancellation-and-coroutines-b5ce9c3ede3a

但是,如果你想在你的类中链接多个方法的函数调用,你可以使用Builder Pattern 方法来定义你的函数。

在这种模式中,所有的 setter 方法都返回类的实例。 例如:

class BankAccountBuilder(name:String, accountNumber:String) 
  private val name:String
  private val accountNumber:String
  private val email:String
  private val newsletter:Boolean = false
  init
    this.name = name
    this.accountNumber = accountNumber
  
  fun withEmail(email:String):BankAccountBuilder 
    this.email = email
    return this
  
  fun wantNewsletter(newsletter:Boolean):BankAccountBuilder 
    this.newsletter = newsletter
    return this
  
  fun build():BankAccount 
    return BankAccount(this)
  

现在你可以像下面这样调用多个 setter:

BankAccount.BankAccountBuilder("Jon", "22738022275")
.withEmail("jon@example.com")
.wantNewsletter(true)
.build()

类似地,您想在实例上调用任何函数,只需让它们返回 instance 本身即可。您不必实现整个模式。

【讨论】:

请注意,由于存在默认/可选参数和数据类,我们通常不会在 Kotlin 中使用 Builder 模式。使用data class,然后在要修改它时使用 .copy(a = 1) 通常比使用 Builder 更好,并且由于允许默认值,因此不需要构建器来构造初始实例。此外,您的格式有点偏离(很多缺失的空格):P 我同意。仅此而已,它不允许像在构建器模式中那样链接对象上的调用。感谢您提供格式提示。 它确实允许链接它。试试这个:data class A(val a: String, val b: String = "i'm a b"); fun test() = A("hi").copy(b="i'm no longer b").copy(a="bye")。有链接并且(应该)编译 感谢@HarshvardhanJoshi,将检查 Future Api,它看起来很有趣【参考方案2】:

顺便说一下,我有一些简单的解决方案,

    传递回调方法,
          private fun getResults(request:String ,callback: (String)->Unit)
             callback("200")
          

          getResults("request",fun(response:String)
            //code
          )
    创建监听器并传递监听器对象
  val listener = object : ResultListener 
     override fun onSuccess(response: Any?, statusCode: Int?) 
         Log.d("apps", "onSuccess: $response")
     

     override fun onFailed(response: Any?, statusCode: Int?) 
         Log.d("apps", "onFailed: $response")
     

 

 getResults(listener)


 private fun getResults(resultListener: ResultListener) 
         resultListener.onSuccess("Success Listener Invoked", 200)
         resultListener.onFailed("Failed Listener Invoked", 200)

 

我喜欢使用监听器的第二种解决方案

【讨论】:

以上是关于Android:异步回调的主要内容,如果未能解决你的问题,请参考以下文章

Android-异步任务-AsyncTask

Flutter的异步回调

Flutter的异步回调

如何使用 Square 的 Retrofit 网络库实现异步回调

[Android]使用函数指针实现native层异步回调

同步回调函数与异步回调函数