java – 处理Volley中的错误(带期货)?

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

所以在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 07002

我是怎么处理错误的? – 还有一个参考脚手架可供使用吗?

解决方法:

首先

VolleyError err_response = err_future.get();

如果请求没有错误你会得到一些强制转换异常并不好.

实际上你不需要2个Futures,因为RequestFuture实现了Response和Error Listeners.

所以说到这一点.

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种主要类型:具有网络响应或没有网络响应的协议/网络错误以及纯粹java和与处理请求/响应相关的其他错误,其中最常见的是解析数据.

有两种主要方法可以处理错误,因为它们不是来自您的代码.

>使用自定义重试策略
>告知用户错误

通常,您可以使用第一个用于某些网络和5xx错误,然后使用一些消息处理程序让用户知道帽子已经发生.

同样,您如何实现这一点取决于您的应用程序架构.我个人使用了很多rxJava并应用了某种数据流设计,我将所有错误都放在一个地方,然后根据请求,错误本身和应用程序状态决定如何处理它们.

对于我的应用程序,我使用jus(highly extended volley)与rx-jus模块和基于rxHub的RxQueueHub类,所以我在一个地方可以获得所有处理程序的所有响应和错误.

上一篇:java – 在dalvik.system.NativeStart.main崩溃(本机方法)


下一篇:java – 直接访问静态字段而不是调用静态getter方法,它更快吗?