Нужно использовать этот метод (Kotlin) в классе Java - PullRequest
1 голос
/ 23 апреля 2020

Я борюсь с этим. У меня есть этот класс в Kotlin с объявленными методами, и мне нужно использовать «onSuccess» внутри класса Java, и я не знаю, как это сделать.

Kotlin класс:

open class Callback<T>(val app: NetworkApplication) : retrofit2.Callback<T> {

private var isSuccessful = false
var onSuccess: ((T?) -> Unit)? = null
var onSuccessWithHeaders: ((T?, HashMap<String, String>) -> Unit)? = null
var onNetworkError: (() -> Unit)? = null
var onServerError: ((String?, String?) -> Unit)? = null
var onFinish: ((Boolean?) -> Unit)? = null
var onUnauthorized: (() -> Unit) = {

// app.goToLogin ()}

override fun onResponse(call: Call<T>, response: Response<T>) {
    if (response.isSuccessful) {
        isSuccessful = true
        onSuccess?.invoke(response.body())
        response.headers()
        onSuccessWithHeaders?.invoke(response.body(), getHeaders(response.headers()))

    } else {
        val errorResponse = getErrorResponse(response)
        when (response.code()) {
            401 -> onUnauthorized()
            500 -> {
                onServerError?.invoke(errorResponse?.codigo, errorResponse?.descripcion)
            }
            else -> {
                onServerError?.invoke(errorResponse?.codigo, errorResponse?.descripcion)
            }
        }
    }
    onFinish?.invoke(isSuccessful)
}

override fun onFailure(call: Call<T>, t: Throwable) {
    onNetworkError?.invoke()
    onFinish?.invoke(isSuccessful)
}

private fun getErrorResponse(response: Response<T>): ErrorResponse? {
    try {
        return GsonConverterFactory.create().responseBodyConverter(
            ErrorResponse::class.java!!,
            arrayOfNulls(0),
            null
        )?.convert(response.errorBody()!!) as ErrorResponse?
    } catch (e: IOException) {
        e.printStackTrace()
    }

    return null
}

private fun getHeaders(headers: Headers): HashMap<String, String> {
    val result = HashMap<String, String>()
    for (i in 0 until headers.size()) {
        result[headers.name(i)] = headers.value(i)
    }
    return result
}

}

В классе Java я попробовал это, но не повезло:

Сначала я объявил это:

private Callback<String> entidadesHabilitadasCallback = new Callback<String>((NetworkApplication)this);

и затем я пытаюсь сделать что-то вроде этого:

entidadesHabilitadasCallback.setOnSuccess();

Но мне нужно указать параметр, и я не знаю, что написать.

1 Ответ

2 голосов
/ 23 апреля 2020

Kotlin Java имеет взаимодействие с лямбда-функцией , оно аналогично преобразованию SAM в java.

Вы можете определить / установить его следующим образом:

entidadesHabilitadasCallback.setOnSuccess(it -> {
    // use it, do something
    return Unit.INSTANCE;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...