ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-如何使用RoboSpice从中断的未缓存请求中正确恢复

2019-11-21 02:01:36  阅读:163  来源: 互联网

标签:robospice java android


我有一个处理我的应用程序登录的简单片段.由于我正在处理登录请求,因此我不想缓存它们.在我在请求中间引入暂停或方向更改之前,该策略可以正常工作.当用户单击登录按钮时,我将显示一个ProgressDialog.当我得到响应(成功或失败)时,这消失了.如果我进入主屏幕,然后在登录请求过程中返回到应用程序,则我的监听器将永远不会收到通知,因此我的ProgressDialog不会被关闭并且我的应用程序将被冻结.我尝试在onStart中添加spiceManager.getFromCache.这很有帮助,但是当应用程序尝试恢复时,结果始终为null …这是有道理的,因为未缓存结果.在这种情况下,配置要通知我的侦听器的正确方法是什么?

// using Jackson2SpringAndroidSpiceService

public void onStart() {
    super.onStart();
    spiceManager.start(getActivity());
    spiceManager.addListenerIfPending(AccessTokenResponse.class, null,
            new AccessTokenResponseRequestListener());

    //spiceManager.getFromCache(AccessTokenResponse.class,
    //        null, DurationInMillis.ALWAYS_EXPIRED,
    //        new AccessTokenResponseRequestListener());
}


private void performRequest(String username, String password) {
    progressDialog = ProgressDialog.show(getActivity(), "", "Logging in...", true);
    LoginFragment.this.getActivity().setProgressBarIndeterminateVisibility(true);
    LoginRequest request = new LoginRequest(username, password);
    spiceManager.execute(request, null, DurationInMillis.ALWAYS_EXPIRED, new AccessTokenResponseRequestListener());
}


private class AccessTokenResponseRequestListener implements RequestListener<AccessTokenResponse> {

    @Override
    public void onRequestFailure(SpiceException e) {
        //update your UI
        if(progressDialog != null && progressDialog.isShowing()) {
            progressDialog.dismiss();
        }
        buttonLogin.setEnabled(true);
        Log.e(TAG, "Login unsuccessful");
        if(e.getCause() instanceof HttpClientErrorException)
        {
            HttpClientErrorException exception = (HttpClientErrorException)e.getCause();
            if(exception.getStatusCode().equals(HttpStatus.BAD_REQUEST))
            {
                Log.e(TAG, "Login unsuccessful");
                Toast.makeText(getActivity().getApplicationContext(),
                        "Wrong username/password combo!",
                        Toast.LENGTH_LONG).show();
            }
            else
            {
                Toast.makeText(getActivity().getApplicationContext(),
                        "Login unsuccessful! If the problem persists, please contact support.",
                        Toast.LENGTH_LONG).show();
            }
        } else {
            Toast.makeText(getActivity().getApplicationContext(),
                "Login unsuccessful! If the problem persists, please contact support.",
                Toast.LENGTH_LONG).show();
        }
    }

    @Override
    public void onRequestSuccess(AccessTokenResponse accessToken) {
        //update  UI
        if(progressDialog != null && progressDialog.isShowing()) {
            progressDialog.dismiss();
        }
        buttonLogin.setEnabled(true);

        if (accessToken != null) { 
            OnAuthenticatedListener listener = (OnAuthenticatedListener) getActivity();
            listener.userLoggedIn(editTextUsername.getText().toString(), accessToken);
        }

    }
}

解决方法:

使用缓存.使用某些缓存键执行请求

spiceManager.execute(request, "your_cache_key", DurationInMillis.ALWAYS_EXPIRED, new AccessTokenResponseRequestListener());

并且在侦听器中,如果您在切换到另一个活动之前成功返回了对该请求的响应,则从缓存中删除对该请求的响应,因为您不想根据需要缓存帐户信息.

@Override
public void onRequestFailure(SpiceException e) {
    ....
    spiceManager.removeDataFromCache(AccessTokenResponse.class);
    ....
}

@Override
public void onRequestSuccess(AccessTokenResponse accessToken) {
    if (accessToken == null) {
        return;
    }
    ....
    spiceManager.removeDataFromCache(AccessTokenResponse.class);
    ....
}

在onStart中,如果您切换到另一个活动,现在返回上一个活动,则尝试获取缓存的响应.该返回响应在您调用spiceManager.shouldStop()之后到达.否则返回null.

spiceManager.getFromCache(AccessTokenResponse.class, "your_cache_key", DurationInMillis.ALWAYS_RETURNED, new AccessTokenResponseRequestListener());

标签:robospice,java,android
来源: https://codeday.me/bug/20191121/2048550.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有