Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.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
Java 如何设置改装请求的优先级_Java_Android_Request_Android Viewpager_Retrofit - Fatal编程技术网

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;
                }
            });
        }
    }
}