Android 改装+;当服务器连接失败时,Rxjava调用onError需要很长时间

Android 改装+;当服务器连接失败时,Rxjava调用onError需要很长时间,android,networking,retrofit,rx-java,connectivity,Android,Networking,Retrofit,Rx Java,Connectivity,我正在使用改型+Rxjava从服务器获取一个实体列表,根据我的设计,当任务失败时,它首先检查Internet连接,然后在doError方法中检查到服务器的连接Observable 当客户端未连接到Internet时,会在合理的时间内调用错误,用户会收到错误消息,但问题是,当连接到Internet时,我得到了错误的端口或域(检查服务器问题错误),这需要很长时间(约1分钟或更长),这真的很烦人。 我怎样才能减少这段时间?原因是什么 如何检查Internet和服务器连接: 公共静态布尔校验连接(字符串

我正在使用改型+Rxjava从服务器获取一个实体列表,根据我的设计,当任务失败时,它首先检查Internet连接,然后在
doError
方法中检查到服务器的连接
Observable

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

如何检查Internet和服务器连接:
公共静态布尔校验连接(字符串ipOrUrl,int端口){
试一试{
int timeoutMs=100;
套接字=新套接字();
SocketAddress SocketAddress=新的InetSocketAddress(IPORRL,端口);
socket.connect(soketAddress,超时);
socket.close();
返回true;
}捕获(IOE异常){
e、 printStackTrace();
返回false;
}
}
如何尝试获取实体列表:
foodgetRetorfitService.getRestaurants()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
//在这里,我正在检查Onlinet中的internet和服务器连接,询问改装是否失败
//如果客户端联机,将再次调用此(getRestaurantFromServer)。
.doon错误(错误->{
错误。printStackTrace();
NetworkUtils.doOnlineTask(新的OnlineTask(){
公共无效Dohenonline(){
getResturantsFromServer();
}
},对);
})
.订阅(新观察员){
@凌驾
公共餐厅(列出餐厅){
restaurantItemAdapter.UpdateDapterData(餐厅);
}
@凌驾
公共无效申报人(可丢弃的e){
Log.e(标记“onError:rxjava和改装错误:无法获取餐厅列表”);
e、 printStackTrace();
}
});
如何实现
doOnlineTask
publicstaticvoiddoonlinetask(OnlineTask OnlineTask,boolean autotry,int retryTimeout){
NetworkUtils.isOnline(自动测定)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.doon错误(错误->{
//这里我检查异常类型(我在检查连接时引发了异常)
if(InternetConnectionException的错误实例)
onlineTask.doWhenInternetFaild();
if(服务器连接异常的错误实例)
onlineTask.doWhenServerFaild();
})
.retryWhen(t->t.delay(2,时间单位秒))
.订阅(结果->{
if(result.equals(NetworkStatus.CONNECTED))
onlineTask.doWhenOnline();
否则{
if(result.equals(NetworkStatus.INTERNET\u FAILD))
onlineTask.doWhenInternetFaild();
else if(result.equals(NetworkStatus.SERVER_FAILD))
onlineTask.doWhenInternetFaild();
}
},error->error.printStackTrace()
);
}
onlineTask
只是一个抽象类
abstract public void doWhenOnline();
互联网失效的公共空间(){
//以某种方式实施
}
public void doWhenServerFaild(){
//以某种方式实施
}
我尝试的是:
我猜是超时问题,所以我用
OkHttpClient
更改了改装超时,但它不起作用。我还改变了自己设定的超时时间,并减少了超时时间。不工作。

我假设您正在使用OkHttp客户端进行改造。您正在查找的很可能是连接超时

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

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

我尝试了这个方法,我将所有超时都改为0(出于测试目的,每个超时都在任何地方),但仍然需要大约18秒来引发错误您是否尝试删除retryWhen函数?除此之外,我帮不了你。我现在试过了,花了22秒才出错,但没用。反正是tnx。