我为不好的标题表示歉意,我对回调函数还很陌生,我不确定如何解释我要实现的目标。
我有一个名为MyClass
的类,其中有一个函数connectToService
。
函数connectToService
进行一些计算,然后使用回调函数调用函数,如下所示:
fun connectToService() {
//Whatever calculations
val a = 7
var b = 3
var c = a + b
val token = MyToken()
token.actionCallback = object: SuperSecretObject {
override fun onSuccess(asyncActionToken: MyToken) {
c++
}
override fun onFailure(asyncActionToken: MyToken) {
c--
}
}
}
我想创建另一个类YourClass
,该类创建MyClass
的对象,然后调用connectToService
函数。当connectToService
函数完成onSuccess
或onFailure
函数时,我想根据触发了哪个函数来做一些事情(每次都有些不同,这就是为什么我不能将其放入其中onSuccess
或onFailure
代码块)。
类似这样的东西:
//Inside `yourClass`
private fun myFunc() {
val yourClassObj = YourClass()
youClassObj.connectToService {
if(onSuccess)
reinventTheWheel()
else
squareIt()
}
youClassObj.connectToService {
combAWatermelon()
}
youClassObj.connectToService {
sharpenMyHammer()
}
}
这可能吗?如果是这样,我该如何实现?如果不是,那么最接近此要求的解决方案是什么?
编辑:
已要求提供更详细的信息,因此尽管我无法提供确切的详细信息,但我会尽力解释发生的情况。
我基本上是在图书馆里简化请愿书。例如,MQTT请愿。这是我想要实现的目标:
/**
* Subscribes to a list of topics and handles the results
*/
fun subscribe(client: MqttAndroidClient, list: MutableList<String>, onMsg: ((String, MqttMessage)->Unit)?=null, conLost: ((Throwable)->Unit)?=null, delComp: ((IMqttDeliveryToken)->Unit)?=null) {
if (client.isConnected) { //Assert connection
for(x in list.iterator()) { //Subscribe to events
client.subscribe(x, 0)
}
client.setCallback(object : MqttCallback {
override fun connectionLost(cause: Throwable) { //Lost connection
Log.i("TAG", "Connection lost")
conLost?.let { it(cause) }
}
@Throws(java.lang.Exception::class)
override fun messageArrived(topic: String, message: MqttMessage) { //Arrived message
Log.i("TAG", "Message arrived: topic => $topic, message => $message")
onMsg?.let { it(topic, message) }
}
override fun deliveryComplete(token: IMqttDeliveryToken) { //Delivery complete
Log.i("TAG", "Delivery complete")
delComp?.let { it(token) }
}
})
}
}
messageArrived
函数必须具有可以根据其所使用的应用程序进行自定义的行为。
例如,在一个应用程序上,我希望onMsg()
函数像这样:
when(topic) {
"firstTopic" -> {
localVariable++
}
"secondTopic" -> {
localMethod()
}
"thirdTopic" -> {
localClass.variable.method()
}
}
如果我在Android设备上使用它,则希望能够更新界面,进行Android API调用等。
答案 0 :(得分:0)
我不确定我是否正确回答了您的问题。我认为您正在寻找的是传递lambda。
fun connectToService(onSucc: ()->Unit, onFail: ()->Unit) {
//Whatever calculations
MyToken().actionCallback = object: SuperSecretObject {
override fun onSuccess(asyncActionToken: MyToken) {
onSucc()
}
override fun onFailure(asyncActionToken: MyToken) {
onFail()
}
}
}
然后您可以像这样调用函数:
connectToService({ /* Something */ }, { /* Something else */ })