Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 访问令牌更新匕首和改装时更新请求标头_Android_Retrofit_Dagger_Okhttp3 - Fatal编程技术网

Android 访问令牌更新匕首和改装时更新请求标头

Android 访问令牌更新匕首和改装时更新请求标头,android,retrofit,dagger,okhttp3,Android,Retrofit,Dagger,Okhttp3,我想在网络请求中更新访问令牌。但是使用Dagger和改装有一些困难 嗯,我已经这么做过很多次了,从来没有注意到访问令牌刷新没有进入OkHttp链的任何问题。以下是我在应用程序中使用的典型设置: @Provides @Singleton SharedPreferences providePreferences(Context ctx) { return new SharedPreferences(ctx); } @Provides @Singleton HttpLoggingInterc

我想在网络请求中更新访问令牌。但是使用Dagger和改装有一些困难


嗯,我已经这么做过很多次了,从来没有注意到访问令牌刷新没有进入OkHttp链的任何问题。以下是我在应用程序中使用的典型设置:

@Provides @Singleton
SharedPreferences providePreferences(Context ctx) {
    return new SharedPreferences(ctx);
}

@Provides @Singleton
HttpLoggingInterceptor provideLoggingInterceptor(){
    return new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY);
}

@Provides @Singleton
OkHttpClient provideClient(HttpLoggingInterceptor interceptor, SharedPreferences prefs){
    return new OkHttpClient.Builder()
            .addNetworkInterceptor(chain -> {
                // Add Auth Header
                String token = prefs.accessToken().get();
                if(token == null) token = "";

                Request request = chain.request().newBuilder().addHeader("Authorization", token).build();
                return chain.proceed(request);
            })
            .addInterceptor(interceptor)
            .build();
}

@Provides @Singleton
Retrofit provideRetrofit(@ApiUrl String url, OkHttpClient client){
    return new Retrofit.Builder()
            .baseUrl(url)
            .client(client)
            .addConverterFactory(LoganSquareConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();
}
SharedPreferences
只是我将一些
RxSharedPreferences
逻辑抽象到的一个类。也可以通过这种方式在应用程序中的任何需要的地方注入,这很好。下面是该课程的一个简单版本,只是为了好玩:

public class SharedPreferences {
    // Constants and variables
    private static final String PREFERENCE_FILENAME = BuildConfig.APPLICATION_ID + ".prefs";
    private static final String PREF_ACCESS_TOKEN= "pref_access_token";

    private RxSharedPreferences mRxSharedPrefs;

    // Constructor
    public SharedPreferences(Context context) {
        mRxSharedPrefs = RxSharedPreferences.create(context.getSharedPreferences(PREFERENCE_FILENAME, Context.MODE_PRIVATE));
    }

    // Helper methods
    public Preference<String> accessToken() { return mRxSharedPrefs.getString(PREF_ACCESS_TOKEN, ""); }

    public void logout() { accessToken().delete(); }
}
公共类共享引用{
//常数和变量
私有静态最终字符串首选项\u FILENAME=BuildConfig.APPLICATION\u ID+“.prefs”;
私有静态最终字符串PREF\u ACCESS\u TOKEN=“PREF\u ACCESS\u TOKEN”;
专用RxSharedPreferences mRxSharedPrefs;
//建造师
公共共享引用(上下文){
mRxSharedPrefs=RxSharedPreferences.create(context.getSharedReferences(PREFERENCE_FILENAME,context.MODE_PRIVATE));
}
//辅助方法
公共首选项accessToken(){return mRxSharedPrefs.getString(PREF_ACCESS_TOKEN,“”;}
public void logout(){accessToken().delete();}
}

这真的有效吗?比如说,如果我在我的活动中注入改造,并发出一个请求,返回我存储到共享首选项中的authtoken。这是否意味着我将能够使用相同的改装实例发出经过身份验证的请求?我想不会。需要有一种方法来重新注入或更新改造。每次发出HTTP请求时读取首选项似乎不是最好的主意。