改造-在应用关闭/后台运行时不发送网络通话

时间:2019-01-24 06:13:03

标签: android retrofit retrofit2 okhttp

我正在将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。任何帮助/指导表示赞赏。

2 个答案:

答案 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/

检查:工作经理,警报经理也