Я попробовал сейчас, и ошибка заняла 22 секунды, это не сработало. TNX в любом случае.

ользую Retrofit + Rxjava для получения списка сущностей с сервера, по моей схеме, когда задача не выполняется, сначала она проверяет подключение к Интернету, а затем проверяет соединение с сервером вdoOnError методObservable.

Когда Клиент не подключен к ИнтернетуdoOnError вызывается в разумные сроки, и пользователь получает сообщение об ошибке, но проблема в том, что когда Интернет подключен, и я получаю неправильный порт или домен (для проверки ошибки сервера). Это занимает много времени (около 1 минуты или дольше), и это действительно раздражает. Как я могу сократить это время и в чем причина?

как я проверяю интернет и соединение с сервером:
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
}
Что я пробовал:

Я догадался, что это проблема тайм-аута, поэтому я изменил тайм-аут Retrofit сOkHttpClient и это не сработало. также я изменил тайм-ауты, установленные мной, и я сократил их. не работает.

Ответы на вопрос(1)

Ваш ответ на вопрос