Skip to content

Network plugin handleOnResume throws ANR #2563

Description

@jacobg

The network plugin's handleOnResume calls getNetworkStatus from main thread, which can be a slow operation:

NetworkStatus afterPauseNetworkStatus = implementation.getNetworkStatus();

I've seen a crashlytics report of an ANR thrown because of this:

android.os.BinderProxy.transactNative (Native method)
This Binder call may be taking too long, causing the main thread to wait, and triggering the ANR.
android.os.BinderProxy.transact (BinderProxy.java:659)
android.net.IConnectivityManager$Stub$Proxy.getActiveNetwork (IConnectivityManager.java:1798)
android.net.ConnectivityManager.getActiveNetwork (ConnectivityManager.java:1549)
com.capacitorjs.plugins.network.Network.getNetworkStatus (Network.java:77)
com.capacitorjs.plugins.network.NetworkPlugin.handleOnResume (NetworkPlugin.java:60)
com.getcapacitor.Bridge.onResume (Bridge.java:1347)
com.getcapacitor.BridgeActivity.onResume (BridgeActivity.java:98)
android.app.Instrumentation.callActivityOnResume (Instrumentation.java:1490)
android.app.Activity.performResume (Activity.java:8281)
android.app.ActivityThread.performResumeActivity (ActivityThread.java:4960)
android.app.ActivityThread.handleResumeActivity (ActivityThread.java:5018)
android.app.servertransaction.ResumeActivityItem.execute (ResumeActivityItem.java:60)
android.app.servertransaction.ActivityTransactionItem.execute (ActivityTransactionItem.java:45)
android.app.servertransaction.TransactionExecutor.executeLifecycleState (TransactionExecutor.java:176)
android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:97)
android.app.ActivityThread$H.handleMessage (ActivityThread.java:2374)
android.os.Handler.dispatchMessage (Handler.java:106)
android.os.Looper.loopOnce (Looper.java:233)
android.os.Looper.loop (Looper.java:344)
android.app.ActivityThread.main (ActivityThread.java:8249)
java.lang.reflect.Method.invoke (Native method)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:589)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1071)

Perhaps this call should make from a background thread like this?

@Override
public void handleOnResume() {
    super.handleOnResume();
    
    // Dispatch heavy operations off the Main thread
    CapacitorJS.getEngine().executeOnBackgroundThread(() -> {
        // Your background work here
    });
}
``

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions