如何在Interceptor中访问上下文?

时间:2015-09-13 03:29:03

标签: android okhttp

我想在拦截器上保存SharedPreferences上的一些东西。 我无法找到办法,因为我无法找到一种方法来访问拦截器上的上下文(因此无法使用PreferencesManager等)。

public class CookieInterceptor implements Interceptor {

@Override public Response intercept(Chain chain) throws IOException {

    PreferenceManager.getDefaultSharedPreferences(Context ??)

}}

有什么想法吗?

我正在使用AndroidStudio&最后一个版本的OkHttp。

谢谢;)

4 个答案:

答案 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 将其注入父类。

  1. 使用 Hilt 注入父类
  2. 将应用上下文添加到父类构造函数
  3. 将上下文作为参数发送给拦截器
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)

}}