如何在改造2.0.1中处理不同类型的异常和错误

Sum*_*man 5 rest android httpresponse retrofit2

我正在使用Retrofit 2.0.1.我想处理所有类型的网络错误和异常(如没有网络连接,超时错误,服务器未找到等)我找到了这个链接.但是在v1.8.0中已经弃用了一些方法.我怎么能在2.0.1中这样做?

Ami*_*mir 7

如果你需要centeralize错误处理程序看看这个线程但是如果你只需要一个简单的错误处理程序,你可以这样做:

 @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
    // ...
  }
Run Code Online (Sandbox Code Playgroud)


Tom*_*ySM 1

无论如何应该检查连接状态,与RetroFit无关,查找ConnectivityManager

(快速解决方案是这样,根据您的需要进行修改):

public boolean isConnected()
{
  ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
  NetworkInfo info = manager.getActiveNetworkInfo();

  return (info != null && info.isConnected());
}
Run Code Online (Sandbox Code Playgroud)

编辑: 考虑这一点 -ConnectivityManager让你知道你有一个用于传出数据的接口,如果你想知道你是否确实有外部链接,我建议 ping 你的服务器(或任何其他已知的会响应的域),如果 ping很好,你有一行, forTimeoutsserverNotFound- 使用在 onFailure() 中返回的 http 代码来进行 api 请求(例如 404、400、200 等)。

为什么

ping 只是一个 udp 数据包,让您知道服务器存在并且处于活动状态,因此 ping 有效但 http 请求将返回的情况Bad Request很有可能,并且可以轻松处理,逻辑取决于您。

对于其他内容 - 实现所需处理所需的所有信息都可以在回调中找到。

本例使用ResponseBody,您可以从 header 中获取配送信息:

@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();
  }
}
Run Code Online (Sandbox Code Playgroud)

超时和 serverNotFound 可以通过 onFailure 回调处理(这是框架,在其中实现您需要的内容,阅读相关内容):

@Override
public void onFailure(Call<ResponseBody> call, Throwable throwable)
{
 //use throwable.get.... to know what happened
 throwable.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

希望这有任何帮助