我想在拦截器上保存SharedPreferences上的一些东西。 我无法找到办法,因为我无法找到一种方法来访问拦截器上的上下文(因此无法使用PreferencesManager等)。
public class CookieInterceptor implements Interceptor {
@Override public Response intercept(Chain chain) throws IOException {
PreferenceManager.getDefaultSharedPreferences(Context ??)
}}
有什么想法吗?
我正在使用AndroidStudio&最后一个版本的OkHttp。
谢谢;)
答案 0 :(得分:3)
您可以创建一个允许您从任何地方(即拦截器)检索上下文的类:
public class MyApp extends Application {
private static MyApp instance;
public static MyApp getInstance() {
return instance;
}
public static Context getContext(){
return instance;
}
@Override
public void onCreate() {
instance = this;
super.onCreate();
}
}
然后将此添加到您的清单中:
<application
android:name="com.example.app.MyApp"
然后在你的拦截器中,执行此操作:
PreferenceManager.getDefaultSharedPreferences(MyApp.getContext());
答案 1 :(得分:3)
您不应该保留上下文的静态实例,因为它会导致内存泄漏。相反,您可以稍微更改您的体系结构,以便能够将上下文作为参数发送到拦截器。
// in your network operations class
// where you create OkHttp instance
// and add interceptor
public class NetworkOperations {
private Context context;
public NetworkOperations(Context context) {
this.context = context;
OkHttpClient client = new OkHttpClient.Builder()
// ... some code here
.addInterceptor(new CookieInterceptor(context))
// ... some code here
.build();
}
}
然后您可以在Interceptor类中使用该上下文实例。
public class CookieInterceptor implements Interceptor {
private Context context;
public CookieInterceptor(Context context) {
this.context = context;
}
@Override
public Response intercept(Chain chain) throws IOException {
PreferenceManager.getDefaultSharedPreferences(context)
}
}
祝你好运!
答案 2 :(得分:0)
使用依赖注入并通过构造函数提供一个SharedPreferences
(不是Context
-在您的示例中,您的Interceptor
需要SharedPreferences
)实例:
class CookieInterceptor implements Interceptor {
private final SharedPreferences prefs;
CookieInterceptor(SharedPreferences prefs) {
this.prefs = prefs;
}
@Override public Response intercept(Chain chain) throws IOException {
prefs.getXXX(...)
}
}
答案 3 :(得分:0)
我自己已经为此奋斗了好几天,最终解决方案很简单,使用 Hilt 将其注入父类。
class RetrofitWithCookie @Inject constructor(
@ApplicationContext context: Context
) {
private val mContext = context
fun createRetrofit(): Retrofit {
val client: OkHttpClient
val builder = OkHttpClient.Builder()
builder.addInterceptor(CookieInterceptor(mContext))
client = builder.build()
return Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build()
}
}
public class CookieInterceptor implements Interceptor {
private Context context;
public CookieInterceptor(Context context) {
this.context = (Context) context;
}
@Override public Response intercept(Chain chain) throws IOException {
PreferenceManager.getDefaultSharedPreferences(Context)
}}