【问题标题】:SharedPreferences instance inside NetworkModuleNetworkModule 中的 SharedPreferences 实例
【发布时间】:2023-03-18 06:09:01
【问题描述】:

我面临 SharedPreferences 问题。我想知道如何在 Retrofit 中调用 SharedPreferences。我的意思是,我有以下文件:

@Module
class NetworkModule {

@Provides
internal fun provideGson(): Gson {
    return GsonBuilder().create()
}

@Provides
internal fun provideOkHttpClient(): OkHttpClient {
    return OkHttpClient.Builder().addInterceptor { chain ->
        val original = chain.request()
        val requestBuilder = original.newBuilder().addHeader("Accept", "application/json")
        val request = requestBuilder.method(original.method(), original.body()).build()
        chain.proceed(request)
    }.build()
}

@Provides
internal fun provideRetrofit(gson: Gson, okHttpClient: OkHttpClient): Retrofit {
    return Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create(gson))
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .baseUrl(BASE_URL)
            .client(okHttpClient)
            .build()
}
}

在我的 Presenter 中,我有以下代码:

override fun getSavedToken() {
    mToken = mSharedPreferences.getString(TOKEN, TOKEN_UNAVAILABLE)
}

... 

inner class GetAccessTokenSubscriber : ResourceObserver<AccessTokenBean>() {

    override fun onNext(@NonNull accessToken: AccessTokenBean) {
        mSharedPreferences.edit().putString(TOKEN, accessToken.token).apply()
        getInformation()
    }

    override fun onError(@NonNull e: Throwable) {
        mView?.displayError()
    }

    override fun onComplete() {
        // Nothing to do
    }
}

目前,为了设置令牌,我将 Bearer $token 放入我的存储库/服务中

// Repository
val newToken = "Bearer $token"
    return mService.getInfos(newToken)

// Service
fun getInfos(@Header("Authorization") token: String

我想知道如何将 Bearer + 令牌放入我的 NetworkModule 文件中?

感谢您的宝贵时间。

【问题讨论】:

  • 模块不用于存储数据,模块仅用于依赖图
  • 我要做的就是创建一个拦截器吧?
  • 你的 sharedPreferences 是 dagger 提供的吗?
  • Singleton 在我的 applicationModule 中提供有趣的 provideSharedPreferences(context: Context): SharedPreferences { return PreferenceManager.getDefaultSharedPreferences(context) }
  • 好的,我正在写一个答案而不是

标签: android kotlin sharedpreferences retrofit retrofit2


【解决方案1】:

如果您想将值放在拦截器上,只需在拦截器提供程序上调用您的SharedPreferences 实例:

@Provides
internal fun provideOkHttpClient(sharedPrefs: SharedPrefs): OkHttpClient {
    return OkHttpClient.Builder().addInterceptor { chain ->
        val original = chain.request()
        val requestBuilder = original.newBuilder().addHeader("Accept", "application/json")
        val request = requestBuilder.method(original.method(), original.body()).build()
        chain.proceed(request)
    }.build()
}

现在 dagger 会寻找它,但它不会找到它,给你一个错误。在这种情况下,如果您的网络模块也是单例,只需添加一个includes = [PreferencesModule::class],如果不是,您可能需要根据首选项模块所在的单例设置当前组件。

【讨论】:

  • 如果我有一个api调用但我不需要“授权”,它会失败吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 2014-04-21
  • 2013-09-15
  • 2012-02-09
相关资源
最近更新 更多