【问题标题】:Retrofit - Not sending network call when app is closed/background改造 - 应用程序关闭/后台时不发送网络调用
【发布时间】:2019-06-17 19:38:35
【问题描述】:

我正在使用带有 OkHttp 的 Retrofit2。除了一件事 - 应用程序关闭或在后台时的网络调用之外,一切都可以正常工作。

工作

每当 Firebase 通知到达时,我都会进行网络调用以获取与该通知相关的数据,然后显示通知。

场景

考虑一个在后台或关闭并收到通知的 Android 应用。

发生了什么

通知成功到达,我可以看到。但是当我尝试拨打电话时,总是报错Failed to connect to: *******,而且我在服务器上看不到任何呼叫。

我见过一些类似的问题,但没有一个能帮助我。 这是一个列表:

有些人建议使用connectionPool,有些人建议使用pingInterval。在我的情况下没有任何效果。不知道是Retrofit还是OkHttp的bug。

下面是我用于调用的一段代码。请记住,当应用程序在前台时它工作得非常好。

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

【问题讨论】:

    标签: android retrofit retrofit2 okhttp


    【解决方案1】:

    我不确定,但你可以测试

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

    【讨论】:

    • 感谢您的回答。我已经在使用这些了。不同之处在于我使用的是TSL 而不是SSL,这对所有人都很常见。即使对于仅在应用程序处于后台时才会失败的当前呼叫。
    • 你可以使用 RxJava 进行测试,我也在后台调用 api 并关闭了应用程序,但它工作正常
    • 问题解决了吗?我有同样的问题
    【解决方案2】:

    要在后台激活某些事件,您需要使用服务。 可以通过使用前台服务或后台服务来完成。 前台服务:https://robertohuertas.com/2019/06/29/android_foreground_services/

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-23
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 2018-10-06
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多