android runtime_error ai_generated true

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.net.ConnectivityManager$NetworkCallback.onAvailable(android.net.Network)' on a null object reference

ID: android/connectivity-manager-network-callback-null

Also available as: JSON · Markdown · 中文
80%Fix Rate
82%Confidence
1Evidence
2024-01-10First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
Android 10 (API 29) active — — —
Android 11 (API 30) active — — —
Android 12 (API 31) active — — —

Root Cause

NetworkCallback instance is null when ConnectivityManager triggers the callback, often due to premature unregistration or lifecycle mismanagement.

generic

中文

当 ConnectivityManager 触发回调时 NetworkCallback 实例为 null,通常是由于过早取消注册或生命周期管理不当。

Official Documentation

https://developer.android.com/reference/android/net/ConnectivityManager.NetworkCallback

Workarounds

  1. 90% success Check callback for null before unregistering: `if (networkCallback != null) { connectivityManager.unregisterNetworkCallback(networkCallback); }`
    Check callback for null before unregistering: `if (networkCallback != null) { connectivityManager.unregisterNetworkCallback(networkCallback); }`
  2. 85% success Use a WeakReference to hold the callback: `private var callbackRef: WeakReference<NetworkCallback>? = null` and check `callbackRef?.get()` before use.
    Use a WeakReference to hold the callback: `private var callbackRef: WeakReference<NetworkCallback>? = null` and check `callbackRef?.get()` before use.
  3. 88% success In Activity onStop(), set a flag and delay unregistration until onDestroy() with null check: `if (isCallbackRegistered && networkCallback != null) { ... }`
    In Activity onStop(), set a flag and delay unregistration until onDestroy() with null check: `if (isCallbackRegistered && networkCallback != null) { ... }`

中文步骤

  1. Check callback for null before unregistering: `if (networkCallback != null) { connectivityManager.unregisterNetworkCallback(networkCallback); }`
  2. Use a WeakReference to hold the callback: `private var callbackRef: WeakReference<NetworkCallback>? = null` and check `callbackRef?.get()` before use.
  3. In Activity onStop(), set a flag and delay unregistration until onDestroy() with null check: `if (isCallbackRegistered && networkCallback != null) { ... }`

Dead Ends

Common approaches that don't work:

  1. Wrap callback call in try-catch NullPointerException 90% fail

    Silently swallows the error but doesn't fix the root cause; callback may never fire again.

  2. Register callback in Application.onCreate() 75% fail

    Application context may outlive Activity; callback still null if unregistered incorrectly.

  3. Use HandlerThread for callback registration 85% fail

    Threading doesn't prevent null reference; the issue is lifecycle, not threading.