【发布时间】:2017-01-23 13:01:21
【问题描述】:
我需要监控并确定我的 Android 应用中的连接状态变化。为此,我已将我的班级注册为广播接收器:
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
context.registerReceiver(this, filter);
现在,为了确定连接状态,您可以执行以下操作:
@Override
public void onReceive(Context context, Intent intent) {
if (!ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
return;
}
NetworkInfo aNetworkInfo =
intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if (aNetworkInfo == null) {
return;
}
boolean isConnected = aNetworkInfo.isConnected();
int networkType = aNetworkInfo.getType();
// by using isConnected & networkType, get the new connectivity status..
}
问题是 ConnectivityManager.EXTRA_NETWORK_INFO 已被弃用。现在,建议您使用CONNECTIVITY_SERVICE 和getActiveNetworkInfo(),类似这样:
@Override
public void onReceive(Context context, Intent intent) {
if (!ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
return;
}
ConnectivityManager connManager =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connManager == null) {
return;
}
NetworkInfo activeNetworkInfo = connManager.getActiveNetworkInfo();
boolean isConnected =
(activeNetworkInfo != null) && activeNetworkInfo.isConnected();
int networkType =
(activeNetworkInfo != null) ? activeNetworkInfo.getType() : -1;
// by using isConnected & networkType, get the new connectivity status..
}
这提出了以下问题:
在第二个实现中,当使用 CONNECTIVITY_SERVICE 而不 EXTRA_NETWORK_INFO:
是否有机会出现竞争条件?由于onReceive是异步调用的,当从连接服务获取网络信息时,连接状态可能与意图中的网络信息不同(因为连接可能同时发生变化)?
意思是,在使用意图时,我确信网络信息包含触发onReceive 的数据,但是在使用服务时 - 网络信息可能会有所不同...?
如果是这样,获取触发onReceive 的信息的最佳方式是什么?
此外,如果这样做的唯一方法是继续使用意图 - 这不是两个事实来源吗? (一个来自连接服务,一个来自发送的意图......)
更新:
可能的竞争条件示例:
有人连接到 WiFi 后立即断开了 WiFi 连接。这将导致发送 2 个意图(一个用于连接到 WiFi,一个用于断开与 WiFi 的连接。实际上发送了更多意图,但我将重点关注这 2 个)。我要问的可能的竞争条件是:当我们获得第一个意图(WiFi 连接)时,额外的意图EXTRA_NETWORK_INFO 将导致isConnected = true 和networkType = TYPE_WIFI。但是,当我从连接服务获取数据时,是否有可能因为 onReceive 被异步调用,WiFi 已经断开连接,导致 isConnected = false 和 networkType = TYPE_WIFI 而意图仍然为此保留正确的值打电话给onReceive?或者这总是会发生得足够快,以便您从 onReceive.. 中的连接服务获得正确的值?
【问题讨论】:
标签: android networking race-condition connectivity