Как использовать метод enque при модернизации в Kotlin android

Я пытаюсь получить ответ от веб-службы, используя модифицированный язык и язык котлин. но я не могу вызвать метод enque.

Это модифицированный клиент

    class WebService() {

    companion object {
        fun createService(isAddToken: Boolean): WebServiceApi {
            val logging = HttpLoggingInterceptor()
            val httpClient = OkHttpClient.Builder()
            var retrofit: Retrofit

            httpClient.addInterceptor { chain ->
                val original = chain.request()
                val requestBuilder = original.newBuilder()
                        .header(CONTENT_TYPE, "application/json")
                        .header(API_USER_NAME, AUTH_USERNAME)
                        .header(API_PASSWORD, AUTH_PASSWORD)
                        .header(LANGUAGE_CODE, "en")
                if (isAddToken) {
                    requestBuilder.header(TOKEN,
                            "" /*DataGenerator.getAuthToken(context)*/)
                }

                requestBuilder.method(original.method(), original.body())
                val request = requestBuilder.build()
                chain.proceed(request)
            }

            // set your desired log level
            if (BuildConfig.DEBUG) {
                logging.level = HttpLoggingInterceptor.Level.BODY
                // add logging as last interceptor
                httpClient.addInterceptor(logging)
            }

            // Timeout handling
            val client = httpClient.readTimeout(20,
                    TimeUnit.SECONDS)
                    .connectTimeout(20, TimeUnit.SECONDS)
                    .writeTimeout(20, TimeUnit.SECONDS)
                    .build()

            if (BuildConfig.DEBUG) {
                retrofit = Retrofit.Builder()
                        .baseUrl(WebServiceConstants.LIVE_BASE_URL)
                        .addConverterFactory(GsonConverterFactory.create())
                        .client(client)
                        .build()
            } else {
                retrofit = Retrofit.Builder()
                        .baseUrl(WebServiceConstants.LIVE_BASE_URL)
                        .addConverterFactory(GsonConverterFactory.create())
                        .client(client)
                        .build()

            }

            return retrofit.create(WebServiceApi::class.java);
        }
    }
}

Это код MainActivity, где я вызываю api на кнопке

 val parameterOTP = SendParameterOTP()
 parameterOTP.phoneNumber = phoneNumber

 var serviceAPI = WebService.createService(false)
 serviceAPI.enque() \\Unable to understand how i call enques**

Я пробовал пример с использованием rxjava, он работает нормально. Но я хочу использовать метод enque, поскольку я хочу реализовать собственный обратный вызов для повторной попытки. Пожалуйста помоги

3
0
4 419
3

Ответы 3

Я предоставляю класс модернизации и вызов API с использованием kotlin и вношу изменения в соответствии с rxjava на вашей стороне.

class ApiClient {

companion object {
    val BASE_URL = "https://simplifiedcoding.net/demos/"
    var retrofit: Retrofit? = null
    fun getClient(): Retrofit? {
        if (retrofit == null) {
            val interceptor = HttpLoggingInterceptor()
            interceptor.level = HttpLoggingInterceptor.Level.BODY
            val client = OkHttpClient.Builder().apply {
            readTimeout(20, TimeUnit.SECONDS)
            writeTimeout(20, TimeUnit.SECONDS)
            connectTimeout(20, TimeUnit.SECONDS)
            addInterceptor(interceptor)
            addInterceptor { chain ->
                var request = chain.request()
                request = request.newBuilder()
                        .build()
                val response = chain.proceed(request)
                response
            }
            }
            retrofit = Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .client(client.build())

                    .addConverterFactory(GsonConverterFactory.create())
                    .build()

        }

        return retrofit
    }
}

}

затем после использования кода ниже для вызова API ..

 var apiInterface: ApiInterface = ApiClient.getClient()!!.create(ApiInterface::class.java)
    var hero: Call<List<Hero>>
    hero = apiInterface.getData()
    hero.enqueue(object : Callback<List<Hero>> {
        override fun onFailure(call: Call<List<Hero>>?, t: Throwable?) {
            closeDialog(dialog)
            Toast.makeText(mContext, t?.message, Toast.LENGTH_SHORT).show()
            Log.d("Error:::",t?.message)
        }

        override fun onResponse(call: Call<List<Hero>>?, response: Response<List<Hero>>?) {
           mHeroDataList.clear()
            if (response != null && response.isSuccessful && response.body() != null) {
                closeDialog(dialog)
                mHeroDataList .addAll(response.body()!!)
                setAdapter(mHeroDataList)
            }
        }

    })

попробуйте использовать это:

val call = createService(isAddToken).methodNameInWebServiceApi(params)
            call.enqueue(object : Callback<ResponseObject> {
                override fun onFailure(call: Call<ResponseObject>?, t: Throwable?) {
                    Log.e("erroe", "")
                }

                override fun onResponse(call: Call<ResponseObject>?, response: Response<ResponseObject>?) {

                }
            })

приложение> build.gradle

//    Retrofit
implementation ("com.squareup.retrofit2:retrofit:$retrofit_version") {
    // exclude Retrofit’s OkHttp peer-dependency module and define your own module import
    exclude module: "okhttp"
}

//    OkHttp and a logging interceptor
implementation("com.squareup.okhttp3:okhttp:$okhttp_version")
implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_version"

проект> build.gradle

buildscript {
    ...
    ext.retrofit_version = '2.6.0'
    ext.okhttp_version = '4.0.0'
    ...
}

имя пакета> внешний> ApiClient.kt

object ApiClient {

    private const val BASE_URL = "https://test.apiary-mock.com/"

    private var retrofit: Retrofit? = null

    val apiClient: Retrofit
        get() {
            if (retrofit == null) {
                val logging = HttpLoggingInterceptor()
                logging.apply {
                    level = if (BuildConfig.DEBUG) HttpLoggingInterceptor.Level.BODY else HttpLoggingInterceptor.Level.NONE
                }

                val client: OkHttpClient = OkHttpClient.Builder()
                    .addInterceptor(logging)
                    .build()

                retrofit = Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .client(client)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build()
            }
            return retrofit!!
        }
}

Применение

val carRestService = ApiClient.apiClient.create(CarRestService::class.java)

Источники

Другие вопросы по теме