jjzjj

android - ConnectivityManager getActiveNetworkInfo() 返回 null

coder 2023-12-27 原文

我有一个功能来检查是否有可用的网络连接,我注意到它对一些用户来说崩溃了。这是函数:

public static boolean isOnline() {
    ConnectivityManager connectionManager = (ConnectivityManager) RouteForMeApplication.getInstance()
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectionManager == null) return false;
    boolean networkAvailable = connectionManager.getActiveNetworkInfo() != null
            && connectionManager.getActiveNetworkInfo().isConnected();
    return networkAvailable;
}

我得到的错误:

java.lang.NullPointerException
   at com.route4me.routeoptimizer.utils.InternetUtils.isOnline(InternetUtils.java:14)
   at com.route4me.routeoptimizer.services.notes.SendNoteServiceDeferred.sendNote(SendNoteServiceDeferred.java:57)
   at com.route4me.routeoptimizer.services.notes.SendNoteServiceDeferred.performAction(SendNoteServiceDeferred.java:28)
   at com.route4me.routeoptimizer.services.AbstractService$2.run(AbstractService.java:75)
   at java.lang.Thread.run(Thread.java:841)

我不明白的是为什么它仍然返回 null,即使我正在检查 getActiveNetworkInfo() 是否不为 null。有什么想法吗?

编辑1 错误在行“&& connectionManager.getActiveNetworkInfo().isConnected();”

最佳答案

很容易成为竞争条件。假设如果 connectionManager.getActiveNetworkInfo() != null 为真,一纳秒后它会再次为真,这是不安全的。

像这样重写:

public static boolean isOnline() {
    ConnectivityManager connectionManager = (ConnectivityManager) RouteForMeApplication.getInstance()
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectionManager == null) {
        return false;
    }
    NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo()
    if (networkInfo == null) {
        return false;
    }
    return networkInfo.isConnected();
}

关于android - ConnectivityManager getActiveNetworkInfo() 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28872310/

有关android - ConnectivityManager getActiveNetworkInfo() 返回 null的更多相关文章

随机推荐