Java 如何设置改装请求的优先级
我有Java 如何设置改装请求的优先级,java,android,request,android-viewpager,retrofit,Java,Android,Request,Android Viewpager,Retrofit,我有ViewPager,在这个ViewPager中有4个片段。很抱歉,我无法添加代码,因为这将非常大。create上的每个片段都向服务器发出异步改造请求。我还有access\u-token和refresh\u-token。因此,当我的access\u令牌过期时,我需要使用refresh\u令牌来更新我的access\u令牌。因此,当我启动应用程序时,它会打开viewPager,其中4个片段执行异步请求。这意味着一次有4个请求。当我的访问令牌过期并且我正在启动我的应用程序时,所有片段都会尝试使用刷
ViewPager
,在这个ViewPager中有4个片段。很抱歉,我无法添加代码,因为这将非常大。create上的每个片段都向服务器发出异步改造请求。我还有access\u-token
和refresh\u-token
。因此,当我的access\u令牌
过期时,我需要使用refresh\u令牌
来更新我的access\u令牌
。因此,当我启动应用程序时,它会打开viewPager,其中4个片段执行异步请求。这意味着一次有4个请求。当我的访问令牌过期并且我正在启动我的应用程序时,所有片段都会尝试使用刷新令牌更新访问令牌。结果是一个片段更新了访问令牌(更新刷新令牌更改后),其他片段也尝试更新令牌,但我得到了401,因为1个片段已经更新了令牌,其他片段尝试使用旧的刷新令牌更新访问令牌
下面是一个请求的示例
Call<ResponseBody> getChatImageCall = apiClient.getImages(cutMessage, CHAT_IMAGE_TYPE);
getChatImageCall.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, final Response<ResponseBody> response) {
if (response.isSuccessful()) {
try {
messagesAdapter.addToStart(MessagesFixtures.getImageBytesMessage(response.body().bytes(), id), true);
} catch (IOException e) {
e.printStackTrace();
}
} else {
Toast.makeText(getActivity(), "Something went wrong", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Toast.makeText(getActivity(), "An error occurred", Toast.LENGTH_SHORT).show();
}
});
Call getchatmagecall=apiClient.getImages(cutMessage,CHAT\u IMAGE\u类型);
getChatImageCall.enqueue(新回调()命令){
@凌驾
公共void onResponse(呼叫、最终响应){
if(response.issusccessful()){
试一试{
messagesAdapter.addToStart(MessagesFixtures.getImageByteMessage(response.body().bytes(),id),true);
}捕获(IOE异常){
e、 printStackTrace();
}
}否则{
Toast.makeText(getActivity(),“出错了”,Toast.LENGTH_SHORT.show();
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
Toast.makeText(getActivity(),“发生错误”,Toast.LENGTH_SHORT.show();
}
});
下面是令牌更新请求部分
public class RefreshToken {
Context context;
TokenUpdaterCallback tokenUpdaterCallback;
ApiClient apiClient = ApiClient.getInstance();
public RefreshToken(Context context, TokenUpdaterCallback tokenUpdaterCallback) {
this.context = context;
this.tokenUpdaterCallback = tokenUpdaterCallback;
}
public void updateToken() {
//Perform this call if access token is expired
SupportObjToken supportObjToken = new SupportObjToken();
supportObjToken.setGrantType("refresh_token");
supportObjToken.setClientId(SharedPreferencesManager.getInstance().getUserData().getClientId());
supportObjToken.setClientSecret(SharedPreferencesManager.getInstance().getUserData().getClientSecret());
supportObjToken.setRefreshToken(SharedPreferencesManager.getInstance().getUserData().getRefreshToken());
Call<RefreshTokenActivation> newToken = apiClient.newToken(supportObjToken);
newToken.enqueue(new Callback<RefreshTokenActivation>() {
@Override
public void onResponse(Call<RefreshTokenActivation> call, Response<RefreshTokenActivation> response) {
if (response.isSuccessful()) {
String newAccessToken = response.body().getAccessToken();
String newRefreshToken = response.body().getRefreshToken();
UserData userData = SharedPreferencesManager.getInstance().getUserData();
SharedPreferencesManager.getInstance().removeUser();
userData.setAccessToken(newAccessToken);
userData.setRefreshToken(newRefreshToken);
SharedPreferencesManager.getInstance().setUser(userData);
tokenUpdaterCallback.updateToken();
} else {
if (response.code() == 401) {
//Perform this call if refresh token is expired
Activity activity = (Activity) context;
MainActivity mainActivity = (MainActivity) activity;
mainActivity.logOut();
Toast.makeText(activity, "You logged on other hardware", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onFailure(Call<RefreshTokenActivation> call, Throwable t) {
Toast.makeText(context, "Response is not successful", Toast.LENGTH_SHORT).show();
}
});
}
}
tokenUpdaterCallback is a simple interface with updateToken() method. So you don't need this.
公共类刷新令牌{
语境;
TokenUpdaterCallback TokenUpdaterCallback;
ApiClient ApiClient=ApiClient.getInstance();
公共刷新令牌(上下文上下文,令牌UpdaterCallback令牌UpdaterCallback){
this.context=上下文;
this.tokenUpdaterCallback=tokenUpdaterCallback;
}
公共void updateToken(){
//如果访问令牌过期,则执行此调用
SupportObjToken SupportObjToken=新的SupportObjToken();
supportObjToken.setGrantType(“刷新令牌”);
supportObjToken.setClientId(SharedReferencesManager.getInstance().getUserData().getClientId());
supportObjToken.setClientSecret(SharedReferencesManager.getInstance().getUserData().getClientSecret());
supportObjToken.setRefreshToken(SharedReferencesManager.getInstance().getUserData().getRefreshToken());
调用newToken=apiClient.newToken(supportObjToken);
enqueue(newcallback()){
@凌驾
公共void onResponse(调用、响应){
if(response.issusccessful()){
字符串newAccessToken=response.body().getAccessToken();
字符串newRefreshToken=response.body().getRefreshToken();
UserData UserData=SharedReferencesManager.getInstance().getUserData();
SharedReferencesManager.getInstance().removeUser();
setAccessToken(newAccessToken);
setRefreshToken(newRefreshToken);
SharedReferencesManager.getInstance().setUser(userData);
tokenUpdaterCallback.updateToken();
}否则{
if(response.code()==401){
//如果刷新令牌过期,则执行此调用
活动=(活动)上下文;
MainActivity MainActivity=(MainActivity)活动;
mainActivity.logOut();
Toast.makeText(活动,“您登录了其他硬件”,Toast.LENGTH_SHORT.show();
}
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
Toast.makeText(上下文,“响应不成功”,Toast.LENGTH_SHORT.show();
}
});
}
}
tokenUpdaterCallback是一个带有updateToken()方法的简单接口。所以你不需要这个。
公共类刷新令牌{
语境;
TokenUpdaterCallback TokenUpdaterCallback;
ApiClient ApiClient=ApiClient.getInstance();
布尔isLoading=false;
公共刷新令牌(上下文上下文,令牌UpdaterCallback令牌UpdaterCallback){
this.context=上下文;
this.tokenUpdaterCallback=tokenUpdaterCallback;
}
公共void updateToken(){
如果(!isLoading){
isLoading=true;
//如果访问令牌过期,则执行此调用
SupportObjToken SupportObjToken=新的SupportObjToken();
supportObjToken.setGrantType(“刷新令牌”);
supportObjToken.setClientId(SharedReferencesManager.getInstance().getUserData().getClientId());
supportObjToken.setClientSecret(SharedReferencesManager.getInstance().getUserData().getClientSecret());
supportObjToken.setRefreshToken(SharedReferencesManager.getInstance().getUserData().getRefreshToken());
调用newToken=apiClient.newToken(supportObjToken);
enqueue(newcallback()){
@凌驾
公共void onResponse(调用、响应){
if(response.issusccessful()){
字符串newAccessToken=response.body().getAccessToken();
字符串newRefreshToken=response.body().getRefreshToken();
UserData UserData=SharedReferencesManager.getInstance().getUserData();
SharedReferencesManager.getInstance().removeUser();
setAccessToken(newAccessToken);
setRefreshToken(newRefreshToken);
public class RefreshToken {
Context context;
TokenUpdaterCallback tokenUpdaterCallback;
ApiClient apiClient = ApiClient.getInstance();
boolean isLoading = false;
public RefreshToken(Context context, TokenUpdaterCallback tokenUpdaterCallback) {
this.context = context;
this.tokenUpdaterCallback = tokenUpdaterCallback;
}
public void updateToken() {
if (!isLoading) {
isLoading = true;
//Perform this call if access token is expired
SupportObjToken supportObjToken = new SupportObjToken();
supportObjToken.setGrantType("refresh_token");
supportObjToken.setClientId(SharedPreferencesManager.getInstance().getUserData().getClientId());
supportObjToken.setClientSecret(SharedPreferencesManager.getInstance().getUserData().getClientSecret());
supportObjToken.setRefreshToken(SharedPreferencesManager.getInstance().getUserData().getRefreshToken());
Call<RefreshTokenActivation> newToken = apiClient.newToken(supportObjToken);
newToken.enqueue(new Callback<RefreshTokenActivation>() {
@Override
public void onResponse(Call<RefreshTokenActivation> call, Response<RefreshTokenActivation> response) {
if (response.isSuccessful()) {
String newAccessToken = response.body().getAccessToken();
String newRefreshToken = response.body().getRefreshToken();
UserData userData = SharedPreferencesManager.getInstance().getUserData();
SharedPreferencesManager.getInstance().removeUser();
userData.setAccessToken(newAccessToken);
userData.setRefreshToken(newRefreshToken);
SharedPreferencesManager.getInstance().setUser(userData);
tokenUpdaterCallback.updateToken();
} else {
if (response.code() == 401) {
//Perform this call if refresh token is expired
Activity activity = (Activity) context;
MainActivity mainActivity = (MainActivity) activity;
mainActivity.logOut();
Toast.makeText(activity, "You logged on other hardware", Toast.LENGTH_SHORT).show();
}
isLoading = false;
}
}
@Override
public void onFailure(Call<RefreshTokenActivation> call, Throwable t) {
Toast.makeText(context, "Response is not successful", Toast.LENGTH_SHORT).show();
isLoading = false;
}
});
}
}
}