【问题标题】:Shared Preference Always Get Old Value In Retrofit Interceptor共享偏好总是在改造拦截器中获得旧值
【发布时间】:2021-05-26 01:07:15
【问题描述】:

我是匕首的新手。所以我只是创建了一个与 Application (SingletonComponent) 一样的模块。

@Module
@InstallIn(SingletonComponent::class)
object SharedPrefModule {

    @Provides
    fun provideSharedPref(@ApplicationContext context: Context) : SharedPrefs{
        return SharedPrefs(context)
    }
}

然后像这样在网络模块中使用 SharedPref。 (见prefs参数)

@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {

    @Singleton
    @Provides
    fun provideRetrofit(okHttp: OkHttpClient) : Retrofit {
        return Retrofit.Builder().apply {
            addConverterFactory(GsonConverterFactory.create())
            addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            client(okHttp)
            baseUrl(BuildConfig.API_BASE_URL)
        }.build()
    }

    @Singleton
    @Provides
    fun provideOkHttp(pref: SharedPrefs) : OkHttpClient {
        return OkHttpClient.Builder().apply {
            connectTimeout(60, TimeUnit.SECONDS)
            readTimeout(60, TimeUnit.SECONDS)
            writeTimeout(60, TimeUnit.SECONDS)
            addInterceptor(RequestInterceptor(pref))
        }.build()
    }

}

RequestInterceptor里面是这样的:

class RequestInterceptor(private val pref: SharedPrefs) : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val token = pref.getToken()
        val newRequest = chain.request().newBuilder()
            .addHeader("Authorization", token)
            .build()
        return chain.proceed(newRequest)
    }
}

我在没有登录的情况下启动应用程序(这意味着 prefs.getToken())将返回空。但问题是,即使我已经登录并成功保存了令牌,pref.getToken() 仍然返回空。我认为实例化 sharedPrefs 存在问题,因为它是单例的。

但是我如何刷新共享首选项实例,以便拦截器始终获取共享首选项的更新值?

如果我想获取共享首选项的新值以便拦截器可以工作,我需要关闭应用程序,然后从任务管理器中滑动/清除

【问题讨论】:

    标签: android retrofit dagger-hilt


    【解决方案1】:

    我通过在 NetworkModule 中添加这个来修复

        @Provides
        fun provideRequestInterceptor(prefs: SharedPrefs) : RequestInterceptor {
            return RequestInterceptor(prefs)
        }
    

    和这样的 RequestInterceptor:

    class RequestInterceptor constructor(private val pref: SharedPrefs) : Interceptor {
        override fun intercept(chain: Interceptor.Chain): Response {
            val token = pref.getToken()
            val newRequest = chain.request().newBuilder()
                .addHeader("Authorization", token)
                .build()
            return chain.proceed(newRequest)
        }
    }
    

    然后在提供 okHttpClient 时,我将函数更改如下:

        @Singleton
        @Provides
        fun provideOkHttp(requestInterceptor: RequestInterceptor) : OkHttpClient {
            return OkHttpClient.Builder().apply {
                connectTimeout(60, TimeUnit.SECONDS)
                readTimeout(60, TimeUnit.SECONDS)
                writeTimeout(60, TimeUnit.SECONDS)
                addInterceptor(requestInterceptor)
            }.build()
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多