Android/Kotlin:在 Retrofit Interceptor 中访问 sharedPreferences

waw*_*los 5 android kotlin retrofit retrofit2

这是一个 Retrofit Interceptor,用于在请求中自动注入令牌。我正在尝试从中获取此令牌,sharedPreferencesgetSharedPreferences在那里不可用。

我如何从这个拦截器内的共享首选项中检索我的令牌?

import android.preference.PreferenceManager
import okhttp3.Interceptor
import okhttp3.Response

class ServiceInterceptor: Interceptor {

    var token : String = "";

    override fun intercept(chain: Interceptor.Chain): Response {
        var request = chain.request()

        if(request.header("No-Authentication") == null){

            if (request.url.toString().contains("/user/signin") === false) {
                // Add Authorization header only if it's not the user signin request.

                // Get token from shared preferences
                val sharedPreference = PreferenceManager.getSharedPreferences()
                token = sharedPreference.getString("token")

                if (!token.isNullOrEmpty()) {
                    val finalToken = "Bearer " + token
                    request = request.newBuilder()
                        .addHeader("Authorization", finalToken)
                        .build()
                }

            }

        }

        return chain.proceed(request)
    }

}
Run Code Online (Sandbox Code Playgroud)

Jak*_*ain 0

您可以创建一个singleton classfor SharedPreference,然后您可以从任何class您想要的地方访问它。

例子

class SessionManager private constructor(context:Context) {
  private val prefs:SharedPreferences
  private val editor:SharedPreferences.Editor
  var token:String
  get() {
    return prefs.getString("token", "")
  }
  set(token) {
    editor.putString("token", token)
    editor.apply()
  }
  init{
    prefs = context.getSharedPreferences("Your_Preference_name", Context.MODE_PRIVATE)
    editor = prefs.edit()
  }
  companion object {
    private val jInstance:SessionManager
    @Synchronized fun getInstance(context:Context):SessionManager {
      if (jInstance != null)
      {
        return jInstance
      }
      else
      {
        jInstance = SessionManager(context)
        return jInstance
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在你必须传入contextof并且可以像 constructor 下面这样访问。ServiceInterceptorSharedPreference

val token = SessionManager.getInstance(context).token;
Run Code Online (Sandbox Code Playgroud)