当服务器连接失败时,Retrofit + Rxjava 需要很长时间才能调用 onError



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

当客户端未连接到互联网时,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
}

我试过什么:

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

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

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

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

最新更新