Android OS是否有特殊机制来限制背景网络连接?

时间:2015-10-28 18:25:22

标签: android okhttp

我用okhttp(2.5.0)创建了大约40个请求,每45秒一次访问互联网(仅用于测试)。手机正常工作时一切正常,但如果手机处于待机状态,则会发生以下异常,

10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err: java.net.ConnectException: failed to connect to api.thinkpage.cn/115.29.232.24 (port 443) after 10000ms: isConnected failed: ECONNREFUSED (Connection refused)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at libcore.io.IoBridge.isConnected(IoBridge.java:238)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at libcore.io.IoBridge.connectErrno(IoBridge.java:171)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at libcore.io.IoBridge.connect(IoBridge.java:122)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at java.net.Socket.connect(Socket.java:882)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at com.squareup.okhttp.internal.Platform$Android.connectSocket(Platform.java:190)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at com.squareup.okhttp.Connection.connectSocket(Connection.java:196)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at com.squareup.okhttp.Connection.connect(Connection.java:172)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at com.squareup.okhttp.Connection.connectAndSetOwner(Connection.java:367)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at com.squareup.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:128)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at com.squareup.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:328)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:245)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at com.squareup.okhttp.Call.getResponse(Call.java:267)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:224)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:195)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at com.squareup.okhttp.Call.access$100(Call.java:34)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at com.squareup.okhttp.Call$AsyncCall.execute(Call.java:162)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at com.squareup.okhttp.internal.NamedRunnable.run(NamedRunnable.java:33)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at java.lang.Thread.run(Thread.java:818)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err: Caused by: android.system.ErrnoException: isConnected failed: ECONNREFUSED (Connection refused)
10-29 01:31:46.563 15846-22190/com.example.weathertrack W/System.err:     at libcore.io.IoBridge.isConnected(IoBridge.java:223)

我测试了好几次,我发现如果我的应用程序在前台,那么40个请求在每一轮都能正常工作;即使我的应用程序是在背景中,但只要手机没有处于待机状态,它似乎也工作正常。但是,几次成功访问后,ConnectException就会发生。在这些测试过程中,我将okhttpclient的最大并发数设置为1。

我在这里也发现了一个老问题。

Creating new socket after closing an old one causes connection refused

Android系统是否在一个处于待机状态的应用程序中同时限制网络访问?

ADD1

现在,我基本可以肯定这个问题是由miui rom造成的。其他人用其他rom测试了它,这样的问题从未发生过。 似乎我应该向谷歌工程师道歉,因为他们错误地指责他们。

0 个答案:

没有答案