我正在使用Retrofit 2.0.1。我想处理所有类型的网络错误和异常(如没有网络连接,超时错误,找不到服务器等)我找到了这个link。但是在v1.8.0中已经弃用了一些方法。我怎么能在2.0.1中做到这一点?
答案 0 :(得分:6)
如果你需要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
// ...
}
答案 1 :(得分:1)
无论如何都应检查连接状态,并且与RetroFit无关,请查看ConnectivityManager
。
(快速解决方案是 喜欢 这个,根据您的需求进行修改):
public boolean isConnected()
{
ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manager.getActiveNetworkInfo();
return (info != null && info.isConnected());
}
编辑:
考虑一下 - ConnectivityManager
让你知道你有一个传出数据的接口,如果你想知道你是否真的有一个外部链接,我建议ping你服务器(或任何其他已知的会响应的domian),如果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();
}
}
可以通过onFailure回调来设置超时和serverNotFound(这是骨架,实现你需要的内容,阅读它):
@Override
public void onFailure(Call<ResponseBody> call, Throwable throwable)
{
//use throwable.get.... to know what happened
throwable.printStackTrace();
}
希望这会有所帮助