我们在Android应用中使用Retrofit与OAuth2安全服务器进行通信.一切都很好,我们使用RequestInterceptor在每次调用时包含访问令牌.但是,有时候,访问令牌将过期,并且需要刷新令牌.当令牌过期时,下一个调用将返回一个未授权的HTTP代码,因此很容易监控.我们可以通过以下方式修改每个Retrofit调用:在失败回调中,检查错误代码,如果它等于Unauthorized,则刷新OAuth令牌,然后重复Retrofit调用.但是,为此,应修改所有呼叫,这不是一个易于维护的好解决方案.有没有办法在不修改所有Retrofit调用的情况下执行此操作?
我正在使用Retrofit和OkHttp库.所以Authenticator如果获得401响应,我有哪个authanticate用户.
我build.gradle是这样的:
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.squareup.okhttp3:okhttp:3.1.2'
Run Code Online (Sandbox Code Playgroud)
我的习惯Authenticator在这里:
import java.io.IOException;
import okhttp3.Authenticator;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.Route;
public class CustomAuthanticator implements Authenticator {
@Override
public Request authenticate(Route route, Response response) throws IOException {
//refresh access token via refreshtoken
Retrofit client = new Retrofit.Builder()
.baseUrl(baseurl)
.addConverterFactory(GsonConverterFactory.create())
.build();
APIService service = client.create(APIService.class);
Call<RefreshTokenResult> refreshTokenResult=service.refreshUserToken("application/json", "application/json", "refresh_token",client_id,client_secret,refresh_token);
//this is syncronous retrofit request
RefreshTokenResult refreshResult= refreshTokenResult.execute().body();
//check if response equals 400 , …Run Code Online (Sandbox Code Playgroud) 我正在尝试将新的Architecture Components添加ViewModel到我的应用程序中,同时用匕首注入它们.我的代码基于google 在这里显示的内容.我试图避免ViewModelFactory为每种ViewModel类型使用,所以我使用了ViewModelFactory它Map<Class<? extends ViewModel>, Provider<ViewModel>> creators.它适用于ViewModels具有@Singleton范围的依赖项.但是,我的一个人ViewModels有一个来自片段的依赖.这是该片段的模块:
@Module
public abstract class DownloadIssueDialogFragmentModule {
@Binds
abstract DialogFragment dialogFragment(DownloadIssueDialogFragment dialogFragment);
@Provides
@FragmentScope
static Issue provideIssue(DownloadIssueDialogFragment dialogFragment) {
return dialogFragment.getIssue();
}
}
Run Code Online (Sandbox Code Playgroud)
我的ViewModelModule:
@Module
public abstract class ViewModelModule {
@Binds
abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelFactory factory);
@Binds
@IntoMap
@ViewModelKey(DownloadIssueViewModel.class)
abstract ViewModel bindDownloadIssueViewModel(DownloadIssueViewModel viewModel);
}
Run Code Online (Sandbox Code Playgroud)
匕首说不能提供Issue.它Map<Class<? extends ViewModel>, Provider<ViewModel>>似乎有意义,因为它似乎是在编译时创建的.但我只会知道该片段范围内的参数.我怎样才能做到这一点?
谢谢.
编辑:
最后,我采用了不同的方法.现在我为每个ViewModel创建一个工厂,而不是注入ViewModel,我注入了工厂.
我创建了这个库: …
android mvvm dagger dagger-2 android-architecture-components