【问题标题】:Android network state change detection takes timeAndroid网络状态变化检测需要时间
【发布时间】:2014-08-14 10:21:21
【问题描述】:

我正在尝试检测我的 android 应用程序中的网络状态变化。我按照那个问题的答案:Check INTENT internet connection

这可行,但广播接收器需要时间来检测更改。当我打开或关闭 wifi 时,大约 10 秒后调用 onReceive() 方法。为什么要花这么多时间?有人可以帮忙吗?

谢谢

这是我的代码:

public class NetworkStateReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    Log.d("app", "Network connectivity change");
    if (intent.getExtras() != null) {
        NetworkInfo ni = (NetworkInfo) intent.getExtras().get(
                ConnectivityManager.EXTRA_NETWORK_INFO);
        if (ni != null && ni.getState() == NetworkInfo.State.CONNECTED) {
            Log.i("app", "Network " + ni.getTypeName() + " connected");
            Toast.makeText(context, "CONNECTED", Toast.LENGTH_LONG).show();
        } else if (intent.getBooleanExtra(
                ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) {
            Toast.makeText(context, "DISCONNECTED", Toast.LENGTH_LONG).show();
            Log.d("app", "There's no network connectivity");
        }
    }

}

}

在我的 Manifest 的应用标签中:

<receiver android:name="com.mypackage.NetworkStateReceiver" >
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
</receiver>

【问题讨论】:

  • 我认为您需要检查互联网连接的可用性,对吗?还是 wifi 连接可用性?
  • @user2851150 我需要检查互联网连接的可用性,无论是 wifi 还是 3g

标签: android broadcastreceiver


【解决方案1】:

我找到了解决办法。

我没有扩展 BroadcastReceiver 类并创建 NetworkStateChangeReceiver,而是在我的活动上创建了一个广播接收器并在那里注册它。现在它可以工作并且立即触发 onReceive() 方法。

【讨论】:

  • 谢谢!不知道为什么其他方法会导致延迟。
【解决方案2】:
public static boolean isInternetAvailable(Context context) {
    boolean isConnection = false;
    ConnectivityManager connectivityManager = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivityManager != null) {
        NetworkInfo[] info = connectivityManager.getAllNetworkInfo();
        if (info != null) {
            for (int index = 0; index < info.length; index++) {
                if (info[index].getState() == NetworkInfo.State.CONNECTED) {
                    isConnection = true;
                    break;
                }
            }
        }
    }
    return isConnection;
}

【讨论】:

    【解决方案3】:

    我的应用中有类似的代码来检测是否存在连接,并提示用户连接状态发生变化。

    在我的应用程序中,它会在一秒钟内收到断开连接的连接更改,但是当您打开 WiFi 时,我的应用程序需要大约 7 秒才能收到连接状态的更改。

    但是,在 Android 发出“已连接到 Wi-Fi 网络 [您的网络名称]”的祝酒词的同时,我收到了状态更改。

    您可能会在连接到网络时同时收到更改,而不是在您按下 Wi-Fi 切换开关将其打开时。

    您是否有特殊原因需要按下切换按钮时的即时反馈?

    【讨论】:

    • 感谢您的回答,但大约 5-10 秒后我收到状态更改,吐司说“已连接到 Wi-Fi 网络 [您的网络名称]”。
    • 而且,当关闭时,我会在大约 10 秒后收到更改
    猜你喜欢
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多