单例将保留改造实例

时间:2018-09-22 14:45:02

标签: android kotlin singleton retrofit okhttp3

因此,我创建了一个登录名,它将使用来自用户的用户名和密码输入,并用Base64进行编码,以创建格式为{{1}的令牌 },其中("Authorization", AUTH)的用户名和密码。这是通过AUTH = "Basic " + Base64 encoding发送的。

最后,它看起来像这样:Headers,其中Authorization: Basic XXXXXX是用户令牌

然后它将通过API请求检查该用户是否存在于数据库中。

我在与XXXXXX相同的类中使用RetrofitOkHttp3,该类负责使用API​​并添加这些RetrofitClient

稍后,我在登录活动中使用Headers类。

我现在需要做的是,通过创建一个RetrofitClient将“ 令牌”用于所有其他活动,之后将存储Singleton的数据成功登录。但是我不知道该怎么做。

3周前,我开始学习Kotlin和Android。

这是我的代码:

GET_LOGIN.kt

Retrofit

RetrofitClient.kt

interface GET_LOGIN {
    @GET("login")
    fun getAccessToken() : Call<String>
}

LoginActivity.kt

class RetrofitClient {

    fun login(username:String, password:String){
        val credentials = username + ":" + password
        val AUTH = "Basic " + Base64.encodeToString(credentials.toByteArray(Charsets.UTF_8), Base64.DEFAULT).trim()
        retrofit = init(AUTH)
    }


    // Initializing Retrofit
    fun init(AUTH: String) : Retrofit{

        // Creating the instance of an Interceptor
        val logging = HttpLoggingInterceptor()
        logging.level = HttpLoggingInterceptor.Level.BODY


        // Creating the OkHttp Builder
        val client = OkHttpClient().newBuilder()


        // Creating the custom Interceptor with Headers
        val interceptor = Interceptor { chain ->
            val request = chain?.request()?.newBuilder()?.addHeader("Authorization", AUTH)?.build()
            chain?.proceed(request)
        }
        client.addInterceptor(interceptor) // Attaching the Interceptor
        //client.addInterceptor(logging) // Attaching the Interceptor



        // Creating the instance of a Builder
        val retrofit = Retrofit.Builder()
                .baseUrl("https://srodki.herokuapp.com/")   // The API server
                .client(client.build())                             // Adding Http Client
                .addConverterFactory(GsonConverterFactory.create()) // Object Converter
                .build()
        return retrofit
    }
    lateinit var retrofit : Retrofit

    fun providesGetLogin(): GET_LOGIN = retrofit.create(GET_LOGIN::class.java)

}

1 个答案:

答案 0 :(得分:1)

首先,请在Java和Kotlin上使用驼峰式大小写。我们在Java和kotlin上都有关于编程的标准。而且我可以看到您正在尝试执行DI,但是那不是您在Android中执行的方式。

无论如何,您可以通过以下两种方式执行此操作,甚至不使用单例,而是将其保存在存储中。选项是共享首选项,本地存储和SQLite。但是,如果您坚持使用单例。您可以这样做:

object MySingleton { // This is how you declare singletons in kotlin
    lateinit var token: String;
}

编辑

因此,从您的评论看来,您似乎需要存储令牌。您可以先使用sharedpreferences(数据库会更好)并将令牌存储在此处。我想你不知道怎么做,这是一个例子:

val sp = SharedPreferences("sp", 0);
sp.edit().putString("token", theTokenVariable); // not sure of this function
sp.edit().apply(); // you could use commit if you dont mind sharedpreferences to lag your screen(if it ever will)

现在您如何从改造中获得代币?我现在可以为您提供帮助的唯一方法是,您可以从改造调用的onResponse收到的响应变量中检索响应主体。从那里开始就是您的问题伴侣。我不知道您的回复格式如何,应如何检索等。 建议将其格式化为JSON。