【发布时间】:2017-01-10 15:11:04
【问题描述】:
我正在使用 Retrofit 2.0.1。我想处理所有类型的网络错误和异常(比如没有网络连接、超时错误、找不到服务器等)我找到了这个link。但有些方法在 v1.8.0 中已弃用。如何在 2.0.1 中做到这一点?
【问题讨论】:
标签: android rest httpresponse retrofit2
我正在使用 Retrofit 2.0.1。我想处理所有类型的网络错误和异常(比如没有网络连接、超时错误、找不到服务器等)我找到了这个link。但有些方法在 v1.8.0 中已弃用。如何在 2.0.1 中做到这一点?
【问题讨论】:
标签: android rest httpresponse retrofit2
如果您需要 centeralize 错误处理程序,请查看 this 线程但是如果您只需要一个简单的错误处理程序,您可以这样做:
@Override
public void onFailure(Throwable throwable) {
if (throwable instanceof HttpException) {
// We had non-2XX http error
}
if (throwable instanceof IOException) {
// A network or conversion error happened
}
// We don't know what happened. We need to simply convert to an unknown error
// ...
}
【讨论】:
无论如何都应该检查连接状态,与RetroFit无关,查找ConnectivityManager。
(快速解决方案是 这个,根据您的需要进行修改):
public boolean isConnected()
{
ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manager.getActiveNetworkInfo();
return (info != null && info.isConnected());
}
编辑:
考虑一下 - ConnectivityManager 让你知道你有一个用于传出数据的接口,如果你想知道你是否真的有一个外部链接,我建议你 ping 你的服务器(或任何其他会响应的已知域),如果ping 很好,你有一行,Timeouts 和 serverNotFound - 使用你在 onFailure() 中返回的 http 代码进行 api 请求(例如 404、400、200 等)。
原因
ping 只是一个 udp 数据包,它让您知道服务器在那里并且还活着,因此 ping 有效但 http 请求将返回 Bad Request 的情况是非常可能的,并且可以轻松处理,逻辑取决于你。
对于其他内容 - 实现所需处理所需的所有信息都可以在回调中找到。
此示例使用ResponseBody,您可以从标头中获取交货信息:
@Override
public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> rawResponse)
{
try
{
String response = rawResponse.headers().toString();
//now print this...
}
catch(Exception e)
{
e.printStackTrace();
}
}
Timeouts 和 serverNotFound 可以通过 onFailure 回调来处理(这是框架,在里面实现你需要的东西,阅读它):
@Override
public void onFailure(Call<ResponseBody> call, Throwable throwable)
{
//use throwable.get.... to know what happened
throwable.printStackTrace();
}
希望这对您有任何帮助
【讨论】: