# java.lang.NullPointerException：尝试在空对象引用上调用虚拟方法 'void android.net.ConnectivityManager$NetworkCallback.onAvailable(android.net.Network)'

- **ID:** `android/connectivity-manager-network-callback-null`
- **领域:** android
- **类别:** runtime_error
- **验证级别:** ai_generated
- **修复率:** 80%

## 根因

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

## 版本兼容性

| 版本 | 状态 | 引入 | 弃用 |
|------|------|------|------|
| Android 10 (API 29) | active | — | — |
| Android 11 (API 30) | active | — | — |
| Android 12 (API 31) | active | — | — |

## 解决方案

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) { ... }`
   ```

## 无效尝试

- **Wrap callback call in try-catch NullPointerException** — Silently swallows the error but doesn't fix the root cause; callback may never fire again. (90% 失败率)
- **Register callback in Application.onCreate()** — Application context may outlive Activity; callback still null if unregistered incorrectly. (75% 失败率)
- **Use HandlerThread for callback registration** — Threading doesn't prevent null reference; the issue is lifecycle, not threading. (85% 失败率)
