Дооснащение - не отправлять сетевой вызов, когда приложение закрыто / фон - PullRequest
0 голосов
/ 24 января 2019

Я использую 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. Любая помощь / руководство приветствуется.

1 Ответ

0 голосов
/ 24 января 2019

Я не уверен, но вы можете проверить

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();
...