实施我的LoginActivity.java,我设置了另一个名为class
的{{1}}文件,它大量使用了Volley。 AuthClient
需要从UserLoginTask
返回Boolean
,以便远程调用登录成功/失败。
所以关注Can I do a synchronous request with volley?,我设置了:
doInBackground
但是看一下调试日志,我得到了错误(来自其他地方,而不是我调试的地方):
08-24 23:17:13.228 7255-7288 E / Volley:[177] BasicNetwork.performRequest:http://192.168.5.3:3003/v1/api/auth的意外响应代码400
我打算如何处理错误? - 还有一个参考工具架可供使用吗?
答案 0 :(得分:4)
首先
VolleyError err_response = err_future.get();
如果请求没有错误,那么你会得到一些强制转换异常。
实际上,你不需要2个期货,因为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;
}
}
}
<强>更新强>
关于最好的客户设计&#39;这取决于您所做的应用程序设计选择。但是,您必须知道的错误很少有重要的事情:
错误可以是3种主要类型:具有网络响应或没有网络响应的协议/网络错误以及纯粹java和与处理请求/响应相关的其他错误,其中最常见的是解析数据。
有两种主要方法可以处理错误,因为它们不是来自您的代码。
通常你可以使用第一个用于某些网络和5xx错误,然后使用一些消息处理程序让用户知道帽子已经发生。
同样,您如何实现这一点取决于您的应用程序架构。我个人使用了很多rxJava并应用了某种数据流设计,我将所有错误放在一个地方,然后根据请求,错误本身和应用状态决定如何处理它们。
对于我的应用程序,我使用jus(highly extended volley)和rx-jus模块以及基于rxHub的RxQueueHub类,因此我可以在一个地方获得所有处理程序的所有响应和错误。
答案 1 :(得分:0)
啊,这很愚蠢,这是解决方案:
if (err_future != null) throw err_future.get();
在try
中添加loginResponseHandler
之后添加:
VolleyError err_response = err_future.get();
现在抛出并捕获错误,因此可以通过编程方式处理。
编辑:我如何获得实际的网络响应? - 像状态代码和错误正文?喜欢:com.android.volley.NetworkResponse