使用Retrofit observable处理网络错误

 手机用户2502898863 发布于 2022-12-29 09:46

使用Obtrables with Retrofit时如何处理网络故障?

鉴于此代码:

Observable observable = api.getApiService().getMyData();
observable
    .doOnNext(new Action1() {
        @Override
        public void call(GetJobResponse getJobResponse) {
            //do stuff with my data
        }
    })
    .doOnError(new Action1() {
        @Override
        public void call(Throwable throwable) {
            //do stuff with error message
        }
    });

如果没有网络,请求就会失败,并且不会调用onError.它不会崩溃,但会无声地失败.日志显示Retrofit获取错误:

 java.net.UnknownHostException: Unable to resolve host "api-staging.sittercity.com": No address associated with hostname
     at java.net.InetAddress.lookupHostByName(InetAddress.java:424)
     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
     at java.net.InetAddress.getAllByName(InetAddress.java:214)
     at com.squareup.okhttp.internal.Dns$1.getAllByName(Dns.java:29)

使用回调,这只是传递给onFailure(RetrofitError错误).如何使用RxJava浮出水面?

2 个回答
  • 我的问题实际上是我的代码中的其他地方 使用rxJava + Retrofit处理网络错误非常简单,因为它只是在onError方法中引发了一个RetrofitError:

     @Override
     public void onError(Throwable e) {
         if (e instanceof RetrofitError) {
            if (((RetrofitError) e).isNetworkError()) {
                //handle network error
            } else {
                //handle error message from server
            }
         }
     }
    

    2022-12-29 09:49 回答
  • 这纯粹是一个RxJava问题,并没有涉及Retrofit那么多.doOnError是副作用,因此即使它处理错误,它也不会"防止"它阻止它向前冒泡.

    您应该查看错误处理操作符.最基本的选项是onErrorReturn()允许您用项(实例GetJobResponse)替换错误.

    您可以在该项目上添加"错误"标志,以便以后在订阅时识别它observable.同样重要的是要知道,如果你不订阅那个可观察的,它基本上是"死的".您应该始终订阅observable而不是使用"doOn___",它们只是副作用(应该用于记录和其他非关键功能).

    2022-12-29 09:52 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有