У меня есть задача Kotlin asyn c, которая выполняет сетевой вызов. Я хотел бы передать метод, который задача должна выполняться во время выполнения - PullRequest
0 голосов
/ 30 марта 2020

Это приложение Kotlin Android, использующее GRP C. Чего я пытаюсь избежать, так это наличия нескольких классов GrpcTask или функций doInBackGround, по одной для каждого сетевого вызова. Например, Войти, выйти, получить некоторые данные и т. Д. c ... в приведенном ниже примере функция sayhello жестко запрограммирована. Есть ли способ передать различные функции в качестве параметра? И имеют разные типы возврата. Я не уверен, как подойти к этому в Kotlin, поэтому я действительно еще ничего не пытался.

  override fun doInBackground(vararg params: Int?): String? {
                val host = params[0]
                val message = params[1]
                val portStr = params[2]
                val port = if (TextUtils.isEmpty("50002")) 0 else Integer.valueOf("50002")
                return try {
                    channel = ManagedChannelBuilder.forAddress("127.0.0.1", 50002).usePlaintext().build()
                    val stub = emeraldSRVGrpc.newBlockingStub(channel)
                /*I would like to make this section dynamic*/
                    val request = HelloRequest.newBuilder().setName(message).build()
                    val reply = stub.sayHello(request)
               /* */
                    reply.message
                } catch (e: Exception) {
                    val sw = StringWriter()
                    val pw = PrintWriter(sw)
                    e.printStackTrace(pw)
                    pw.flush()

                    "Failed... : %s".format(sw)
            }

1 Ответ

0 голосов
/ 30 марта 2020

Конечно, вы можете сделать что-то подобное:

fun <Input, Output> doInBackground(
    vararg params: Int?,
    inputHandler: (Array<Int?>) -> Input,
    outputHandler: (Input) -> Output): Output {
    val host = params[0]
    val message = params[1]
    val portStr = params[2]

    return outputHandler(inputHandler(arrayOf(host, message, portStr)))
}

, где Input, Output может быть любого типа, который вам нравится. Здесь inputHandler, outputHandler являются необходимыми функциями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...