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 概念。
【问题讨论】:
请详细说明您的问题并解释您的总体目标,并添加一些您检查过的示例代码或文档 如果我理解正确,你想设置onSuccess
和 onFailure
回调背靠背...告诉我如果我错了...
@HarshvardhanJoshi 正确!但需要从方法返回值处理,一个类有多个方法都需要实现相同的行为
【参考方案1】:
如果你想像你更新的javascript示例那样设置回调,你需要使用Future
API来实现与javascript示例相同的回调链。
Future
kotlin/java/dart 等价于 JS 中的Promise
。
但是在 kotlin 中,Future
、Promise
和 coroutine
都可用。
建议使用 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:异步回调的主要内容,如果未能解决你的问题,请参考以下文章