Я попробовал сейчас, и ошибка заняла 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
и это не сработало. также я изменил тайм-ауты, установленные мной, и я сократил их. не работает.