簡體   English   中英

如何在Kotlin android中使用enque方法進行改造

[英]How to use enque method in retrofit in Kotlin android

我正在嘗試使用改造和kotlin語言從Web服務獲得響應。 但我無法調用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方法,因為我想實現自定義回調重試。 請幫忙

我使用kotlin提供改裝類和api調用,並根據你身邊的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>?) {

                }
            })

app> 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"

project> build.gradle

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

package.name> external> 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)

來源

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM