Connectivity Manager unregisterNetworkCallBack already unregistered

Viewed 6637

In my android application I am unregistering a networkCallback onPause of an activity. There are times where I can get the error, Caused by

java.lang.IllegalArgumentException
NetworkCallback was already unregistered

Is there a way to check if the network callback already was unregistered or to prevent "double" unregistering? Or registered so we known when to call unregister?

if (mNetworkCallback != null && mConnectivityManager != null) {
           try{
               mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);

           }
           catch (Exception e){
               Log.d(TAG, "unregister failed");
           }
        }
4 Answers

There is no method to check if the network is already unregistered.

  1. Try to put your code in:
try{
    //your code
} 
catch (IllegalArgumentException exception){
    //network is already unregistered
}
  1. Or simply you can handle it with boolean flag yourself.

I just downgraded the version of Connectivity from 0.4.9+5 to 0.4.9+3 and it worked for me

This is how it would work in Kotlin:

try {
    // Your code
} catch (e: Exception) {
    // i.e. NetworkCallback was already unregistered
}

You can search the source code of android to see unregisterNetworkCallback() best practices here.

It's actually very similar to what you currently have however you aren't setting your callback to null after unregister. Update your current code to this and it'll follow the pattern currently used in Android as per the above link and hopefully solve your issue.

if (mNetworkCallback != null && mConnectivityManager != null) {
   try{
       mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
       // Added code: Set call back to null so this doesn't get called again.
       mNetworkCallback = null;
   }
   catch (Exception e){
       Log.d(TAG, "unregister failed");
   }
}
Related