Как использовать контекст в классах Kotlin на Android - PullRequest
1 голос
/ 09 апреля 2019

В моем приложении я использую Retrofit и okHttpClient для получения запроса к серверу.
В этой конфигурации retrofit я хочу отправить некоторые данные вHeader на сервер.
Эти данные UUID устройства и для get UUID устройства Я пишу код ниже в одном классе (это имя класса Extensions):

@SuppressLint("HardwareIds")
fun Context.getDeviceUUID(): String {
    return try {
        Settings.Secure.getString(contentResolver, Settings.Secure.ANDROID_ID)
    } catch (e: Exception) {
        "exception"
    }
}

Для получения UUID устройства я должен передать context.

И я хочу отправить это UUID устройства в ApiClient класс.
класс ApiClient:

class ApiClient {

    private val apiServices: ApiServices

    init {
        //Gson
        val gson = GsonBuilder()
            .setLenient()
            .create()

        //Http log
        val loggingInterceptor = HttpLoggingInterceptor()
        loggingInterceptor.level =
            if (BuildConfig.DEBUG) HttpLoggingInterceptor.Level.BODY else HttpLoggingInterceptor.Level.NONE

        //Http Builder
        val clientBuilder = OkHttpClient.Builder()
        clientBuilder.interceptors().add(loggingInterceptor)
        clientBuilder.addInterceptor { chain ->
            val request = chain.request()
            request.newBuilder().addHeader("uuid", ).build()
            chain.proceed(request)
        }

        //Http client
        val client = clientBuilder
            .readTimeout(NETWORK_CONNECTIONS_TIME, TimeUnit.SECONDS)
            .writeTimeout(NETWORK_CONNECTIONS_TIME, TimeUnit.SECONDS)
            .connectTimeout(NETWORK_CONNECTIONS_TIME, TimeUnit.SECONDS)
            .retryOnConnectionFailure(true)
            .build()

        //Retrofit
        val retrofit = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))
            .build()

        //Init apiServices
        apiServices = retrofit.create(ApiServices::class.java)
    }

    companion object {
        private var apiClient: ApiClient? = null

        val instance: ApiClient
            get() {
                if (apiClient == null) {
                    apiClient = ApiClient()
                }
                return apiClient as ApiClient
            }
    }
}

Я должен использовать getDeviceUUID в этом коде: request.newBuilder().addHeader("uuid", ).build()

как можноя передаю context в ApiClient класс?

1 Ответ

1 голос
/ 09 апреля 2019

Вам необходимо изменить ApiClient, иметь конструктор и параметр в get().

class APiClient(var deviceId: String) {
init {
    //Stuff goes here
}
companion object {
    private var apiClient: APiClient? = null
    fun getInstance(deviceId: String): APiClient =
            apiClient ?: synchronized(this) {
                apiClient ?: APiClient(deviceId).also {
                    apiClient = it
                }
            }
}
}

PS, deviceUUID может быть глобальным, потому что он не изменится. Лучший подход будет просто позволить ему быть в глобальном доступе, как в классе приложения. От того, где вы можете напрямую использовать его. Нет необходимости каждый раз передавать его в конструктор.

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