在内部创建另一个回调的回调函数

时间:2020-07-30 09:06:19

标签: kotlin

我为不好的标题表示歉意,我对回调函数还很陌生,我不确定如何解释我要实现的目标。

我有一个名为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函数完成onSuccessonFailure函数时,我想根据触发了哪个函数来做一些事情(每次都有些不同,这就是为什么我不能将其放入其中onSuccessonFailure代码块)。

类似这样的东西:

//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调用等。

1 个答案:

答案 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 */ })