当前位置: 首页 > 面试题库 >

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

斜俊
2023-03-14
问题内容

我有一个处理我的应用程序登录的简单片段。由于我正在处理登录请求,因此我不想缓存它们。在我在请求中间引入暂停或方向更改之前,该策略可以正常工作。当用户单击登录按钮时,我将显示一个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());


 类似资料:
  • 问题内容: X项目包含以下部分: 一个。Spring Data存储库具有单独的方法,例如: b。hibernate方式也使用“ xobjects”缓存。 问题#1 由于有两种添加对象以缓存的方法,因此可能是同一对象出现2次的情况。如何更好地解决这个问题?例如,使用结果对象中的键。就像是: 键=“#result.id” 问题#2 我不想在调用“保存”方法时从缓存中逐出所有对象,但是我不确定当前的实现

  • 我试图找到使用httr包通过R连接Appannie的API的方法(根本没有API连接的经验)。API要求包含来自appannie网站的请求标题引用:注册App Annie帐户并生成API密钥。将此密钥添加到您的请求标头中,如下所示: 授权:持有人“”引用 我写了这样的代码 命令http_status(getdata)显示我"客户端错误:(401)未经授权"有人能帮我吗,我做错了什么?

  • 本文向大家介绍如何中断axios的请求?相关面试题,主要包含被问及如何中断axios的请求?时的应答技巧和注意事项,需要的朋友参考一下 <button onclick="test()">click me</button> <script src="https://unpkg.com/axios@0.18.0/dist/axios.js"&gt;&lt;/script> <script> const

  • 我很清楚关于这个话题有多个问题,但我就是弄不懂它的意思。问题似乎是没有将新值添加到@cacheable列表中。 调试完问题后,我发现问题似乎出在钥匙上。 下面是代码片段 所以当我调用save方法时,用于缓存的关键字是incrementing integer,或者1,2,3...但是当我尝试获取所有文档时,缓存使用SimpleKey[]作为键。如果我尝试为@Cacheable使用相同的键,我会得到S

  • 在我的web应用程序上,我正在向url发送POST请求。它正常工作。 问题是,这个web应用程序也应该脱机工作。当由于连接问题而无法完成请求时,我将显示一个通知,当问题解决后,用户可以再次同步。 当我为了调试而断开internet连接时,我发现每次请求都返回200状态码。 浏览器不应该缓存POST请求,我错了吗? 在搜索堆栈溢出后,我尝试了这里编写的解决方案。 我试图从服务器(PHP/Ubuntu

  • 我正在使用reverfit/robospice在我构建的应用程序中进行api调用,该应用程序带有一个reverfitGsonSpiceService。所有响应都使用GSON转换器转换为POJO,但是我需要从response头中检索一些信息。我找不到任何获取标头的方法(只有在请求不成功的情况下才能获取标头,因为原始响应是在错误对象中发送的!)如何在转换前截取响应以抓取头?