我正在将Retrofit2与OkHttp一起使用。除了一件事,一切都可以正常工作-当应用关闭或在后台时进行网络通话。
工作
每当Firebase通知到达时,我都会进行网络呼叫以获取与该通知有关的数据,然后显示通知。
场景
考虑一个处于后台或关闭状态且通知已到达的Android应用。
正在发生的事情
通知成功到达,我可以看到它。但是,当我尝试拨打电话时,总是发出错误Failed to connect to: *******
,服务器上看不到任何来电。
我看到过类似的问题,但是没有一个可以帮助我。 这是清单:
有些建议使用connectionPool
,有些建议使用pingInterval
。在我的情况下没有任何效果。我不确定这是Retrofit还是OkHttp的错误。
下面是我用于通话的一段代码。请记住,当应用程序处于前台状态时,它的工作情况非常好。
OkHttpClient.Builder builder = getHttpBuilder()
.connectionSpecs(getSpecList());
retrofit = new Retrofit.Builder()
.baseUrl(Session.getBaseUrl())
.client(builder.build())
.build();
Call<ResponseBody> call = retrofit
.create(Webservice.class)
.pullNotify(authToken, ivB64, digest, Session.getTimestamp());
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
listener.onNetworkCallSuccess(response);
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
listener.onNetworkCallFailure(t);
}
});
它总是返回SocketTimeoutException
。任何帮助/指导表示赞赏。
答案 0 :(得分:0)
我不确定,但是您可以测试
var GLOBAL_CONNECTION_POOL = ConnectionPool(5, 1, TimeUnit.MINUTES)
private fun createClient(): OkHttpClient? {
try {
val trustAllManager = object : X509TrustManager {
override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {}
override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {}
override fun getAcceptedIssuers(): Array<X509Certificate> {
return arrayOf()
}
}
val trustAllCerts = arrayOf<TrustManager>(trustAllManager)
val sslContext = SSLContext.getInstance("SSL")
sslContext.init(null, trustAllCerts, SecureRandom())
val sslSocketFactory = sslContext.socketFactory
val builder = OkHttpClient.Builder()
builder.followRedirects(false)
builder.sslSocketFactory(sslSocketFactory, trustAllManager)
builder.hostnameVerifier { hostname, session -> true }
builder.readTimeout(TIMEOUT, TimeUnit.MILLISECONDS)
builder.connectionPool(GLOBAL_CONNECTION_POOL)
builder.addInterceptor(logging)
return builder.build()
} catch (e: Exception) {
e.printStackTrace()
}
return null
}
并更改:
retrofit = new Retrofit.Builder()
.baseUrl(Session.getBaseUrl())
.client(createClient())
.build();
答案 1 :(得分:0)
要在后台激活某些事件,您需要使用服务。 它可以通过使用前台服务或后台服务来完成。 前台服务:https://robertohuertas.com/2019/06/29/android_foreground_services/
检查:工作经理,警报经理也