【问题标题】:Retrofit + Rxjava takes long time to invoke onError when server connection failed当服务器连接失败时,Retrofit + Rxjava 需要很长时间才能调用 onError
【发布时间】:2018-02-22 10:42:18
【问题描述】:

我正在使用 Retrofit + Rxjava 从服务器获取实体列表,根据我的设计,当任务失败时,它首先检查 Internet 连接,然后在 doOnErrorObservable 方法中检查与服务器的连接。

当客户端未连接到 Internet doOnError 在合理的时间内被调用并且用户收到错误消息但问题是当 Internet 连接时我得到错误的端口或域(检查服务器问题错误)它需要很长时间(大约 1 分钟或更长时间),这真的很烦人。 我怎样才能减少这个时间,原因是什么?

我如何检查 Internet 和服务器连接:

public static boolean checkConnection(String ipOrUrl, int port) {
    try {
        int timeoutMs = 100;
        Socket socket = new Socket();
        SocketAddress soketAddress = new InetSocketAddress(ipOrUrl, port);
        socket.connect(soketAddress, timeoutMs);
        socket.close();
        return true;
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }
}

我如何尝试获取实体列表:

    foodgetRetorfitService.getRestaurants()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
//here I'm checking the internet and server connection in the onlineTask if retrofit fail
//and if clients get Online this ( getRestaurantFromServer ) is called again.
            .doOnError(error -> {
                error.printStackTrace();
                NetworkUtils.doOnlineTask(new OnlineTask() {
                    public void doWhenOnline() {
                        getResturantsFromServer();
                    }
                }, true);
            })
            .subscribe(new Observer<List<Restaurant>>() {
                @Override
                public void onNext(List<Restaurant> restaurants) {
                    restaurantItemAdapter.updateAdapterData(restaurants);
                }

                @Override
                public void onError(Throwable e) {
                    Log.e(TAG, "onError: rxjava and retrofit error : can't get restaurant list");
                    e.printStackTrace();
                }
            });

doOnlineTask 是如何实现的

    public static void doOnlineTask(OnlineTask onlineTask, boolean autoRetry, int retryTimeout) {
        NetworkUtils.isOnline(autoRetry)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnError(error -> {
//here I check the Exception type ( I raised them when checking the connection )
                    if (error instanceof InternetConnectionException)
                        onlineTask.doWhenInternetFaild();

                    if (error instanceof ServerConnectionException)
                        onlineTask.doWhenServerFaild();
                })
                .retryWhen(t -> t.delay(2, TimeUnit.SECONDS))
                .subscribe(result -> {
                            if (result.equals(NetworkStatus.CONNECTED))
                                onlineTask.doWhenOnline();
                            else {
                                if (result.equals(NetworkStatus.INTERNET_FAILD))
                                    onlineTask.doWhenInternetFaild();
                                else if (result.equals(NetworkStatus.SERVER_FAILD))
                                    onlineTask.doWhenInternetFaild();
                            }
                        }, error -> error.printStackTrace()
                );
    }

onlineTask 只是一个抽象类

abstract public void doWhenOnline();

public void doWhenInternetFaild() {
   //implemented somehow
}


public void doWhenServerFaild() {
   //implemented somehow
}

我尝试了什么:

我猜是超时问题,所以我用OkHttpClient 更改了改造超时,但它不起作用。我也更改了自己设置的超时,并减少了它们。不工作。

【问题讨论】:

    标签: android networking retrofit rx-java connectivity


    【解决方案1】:

    我假设您正在使用 OkHttp 客户端来搭配 Retrofit。您正在寻找的很可能是连接超时。

    您可以在构建客户端时设置不同的超时时间。

    OkHttpClient client = new OkHttpClient().newBuilder()
                    .connectTimeout(30, TimeUnit.SECONDS)
                    .readTimeout(60, TimeUnit.SECONDS)
                    .writeTimeout(15, TimeUnit.SECONDS)
                    .build();
    

    【讨论】:

    • 我试过了,我把所有的超时都改成了 0(为了测试目的,任何地方的每个超时)仍然需要大约 18 秒才能引发错误
    • 您是否尝试过删除 retryWhen 函数?除此之外,我帮不了你。
    • 我现在试过了,花了 22 秒才出现错误,它没有工作。 tnx 反正。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 2018-12-05
    相关资源
    最近更新 更多