Android牛轧糖:提交了太多NetworkRequests

Dim*_*ira 5 android android-7.0-nougat android-7.1-nougat

在Android Nougat 7.1.1上连续使用应用程序后,它开始在后台崩溃,直到手动启动。从Firebase,我得到以下日志:

Caused by java.lang.IllegalArgumentException: Too many NetworkRequests filed
android.os.Parcel.readException (Parcel.java:1688)
android.os.Parcel.readException (Parcel.java:1637)
android.net.IConnectivityManager$Stub$Proxy.pendingListenForNetwork (IConnectivityManager.java:2460)
android.net.ConnectivityManager.registerNetworkCallback (ConnectivityManager.java:3127)
com.XXX.XX.location.GPSControl$Companion.setInitialized (GPSControl.java)
__null__.getGApiClient (GPSControl.java)
__null__.setGApiClient (GPSControl.java)
__null__.setConnMan (GPSControl.java)
__null__.setSf (GPSControl.java)
__null__.init (GPSControl.java)
__null__.getPI (GPSControl.java)
__null__.triggerLocation (GPSControl.java)
__null__.triggerLocation$default (GPSControl.java)
__null__.access$getInitialized$p (GPSControl.java)
com.XXX.XX.KGL.afterLoginSetup (KGL.java)
com.XXX.XX.KGL.onCreate (KGL.java)
android.app.Instrumentation.callApplicationOnCreate (Instrumentation.java:1025)
android.app.ActivityThread.handleBindApplication (ActivityThread.java:5460)
android.app.ActivityThread.-wrap2 (ActivityThread.java)
android.app.ActivityThread$H.handleMessage (ActivityThread.java:1556)
android.os.Handler.dispatchMessage (Handler.java:102)
android.os.Looper.loop (Looper.java:154)
android.app.ActivityThread.main (ActivityThread.java:6176)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:888)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:778)
Run Code Online (Sandbox Code Playgroud)

我检查了android marshmallow源代码,它不包含引发此错误的代码,但是master分支却包含了,因此我们可以得出结论,此错误是特定于Nougat的。

    private void enforceRequestCountLimit() {
        synchronized (mUidToNetworkRequestCount) {
            int networkRequests = mUidToNetworkRequestCount.get(mUid, 0) + 1;
            if (networkRequests >= MAX_NETWORK_REQUESTS_PER_UID) { //MAX_NETWORK_REQUESTS_PER_UID == 100
                throw new IllegalArgumentException("Too many NetworkRequests filed");
            }
            mUidToNetworkRequestCount.put(mUid, networkRequests);
        }
    }
Run Code Online (Sandbox Code Playgroud)

请求计数器多久重置一次?

当接近极限时,如何获取当前网络请求数以减少活动?

Nin*_*off 8

从问题评论中引用@CommonsWare:

\n\n

根据我对源代码的阅读,您可能会从太多的 registerNetworkCallback() 调用而没有相应的 unregisterNetworkCallback() 调用中得到此信息。确保您正在清理这些回调。\xe2\x80\x93 CommonsWare 2017 年 1 月 31 日 13:06

\n