java - 处理 Volley 中的错误(有 future )?

标签 java android error-handling android-volley dalvik

实现我的 LoginActivity.java ,我设置了另一个名为 AuthClient 的文件+class,它大量使用了 Volley。 UserLoginTask 需要从其 doInBackground 返回一个 Boolean,以便远程登录调用成功/失败。

接着Can I do a synchronous request with volley? ,我设置:

void login(final HashMap<String, String> data,
           Response.Listener<JSONObject> listener,
           Response.ErrorListener errorListener) {
    JsonObjectRequest req = new JsonObjectRequest(
            api_prefix + "/auth", new JSONObject(data), listener, errorListener
    );
    queue.add(req); // RequestQueue
}

boolean loginResponseHandler(RequestFuture<VolleyError> err_future,
                             RequestFuture<JSONObject> future) {
    try {
        VolleyError err_response = err_future.get();
        JSONObject response = future.get();
        System.out.println("response.toString() = " + response.toString());
        return true;
    } catch (InterruptedException | ExecutionException e) {
        System.err.println("e = " + e.toString());
        return false;
    } catch (Exception e) { // Even tried this!
        System.err.println("Exception::e = " + e.toString());
        throw e;
    }
}

@Override
protected Boolean doInBackground(Void... params) {
    RequestFuture<JSONObject> future = RequestFuture.newFuture();
    RequestFuture<VolleyError> err_future = RequestFuture.newFuture();

    login(/*omitted for brevity*/, err_future, future);
    return loginResponseHandler(err_future, future);
} // Actual code has login/loginResponseHandler in separate class+file, and more^

但是查看调试日志,我得到了错误(来自其他地方,而不是我正在调试的地方):

08-24 23:17:13.228 7255-7288 E/Volley: [177] BasicNetwork.performRequest: Unexpected response code 400 for http://192.168.5.3:3003/v1/api/auth

我打算如何处理错误? - 还有引用脚手架吗?

最佳答案

首先

VolleyError err_response = err_future.get();

如果请求没有错误你会得到一些转换异常是不好的。

实际上您不需要 2 个 Future,因为 RequestFuture 实现了响应和错误监听器。

言归正传

future.get()

返回结果。如果发生错误,则它会抛出执行异常,该异常可能包含 VolleyError 异常,如果收到任何网络数据,该异常可能包含一些网络数据。 您需要做的就是将内部异常转换为 VolleyError 并在您的 catch 语句中获取数据。

try {
    JSONObject response = future.get();
    System.out.println("response.toString() = " + response.toString());
    return true;
} catch (InterruptedException | ExecutionException e) {
    if (VolleyError.class.isAssignableFrom(e.getCause().getClass())) {
        VolleyError ve = (VolleyError) e.getCause();
        System.err.println("ve = " + ve.toString());
        if (ve.networkResponse != null) {
            System.err.println("ve.networkResponse = " +
                               ve.networkResponse.toString());
            System.err.println("ve.networkResponse.statusCode = " +
                               ve.networkResponse.statusCode);
            System.err.println("ve.networkResponse.data = " +
                               new String(ve.networkResponse.data));
            return false;
        }
    }
}

更新

至于“最佳客户端设计”,这取决于您做出的应用设计选择。然而,对于错误,您必须知道一些重要的事情:

错误可以是 3 种主要类型:有或没有网络响应的协议(protocol)/网络错误,以及其他纯 Java 错误和与处理请求/响应相关的错误,其中最常见的是解析数据。

有两种主要方法可以处理不是来自您的代码的错误。

  1. 使用自定义重试策略
  2. 通知用户错误

通常您可以使用第一个来处理某些网络和 5xx 错误,然后使用一些消息处理程序让用户知道发生了什么。

同样,如何实现它实际上取决于您的应用架构。我个人经常使用 rxJava 并应用某种数据流设计,我将所有错误集中在一个地方,然后根据请求、错误本身和应用程序状态决定如何处理它们。

对于我的应用程序,我使用 jus(highly extended volley)使用 rx-jus 模块和基于 rxHub 的 RxQueueHub 类所以我将所有响应和错误集中在一个位置,供我的所有处理程序使用。

关于java - 处理 Volley 中的错误(有 future )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39124922/

相关文章:

java - SpringJUnit4ClassRunner 在 Spring5 中损坏了吗?

java - 对字符串进行快速排序

java - Kotlin stdlib 和数据绑定(bind)

javascript - 使用 audio.play() 函数时 react 错误

php - 使用 JavaScript 和 PHP 的动态表单问题

java - 如何在 OSGi 中欺骗 java 包(以及 API 的一部分)?

java - Google App Engine 的负载平衡器如何工作?

java - 我点击按钮时出现崩溃错误;指定的子项已经有父项。您必须首先对 child 的 parent 调用removeView()

来自 PreferenceFragment 的 AndroidRestart Activity

c# - 如果记录器无法记录怎么办?