您应该查看https://gist.github.com/PasanBhanu/730a32a9eeb180ec2950c172d54bb06a上的初步讨论。
基本上,我们正在开发一个简单易用的解决方案来检查 android 应用程序上的网络,它可以优雅地替换现在已弃用的NetworkInfo类,而不会中断旧应用程序的代码流。问题仅出现在切换到 wifi 时,而不是切换到蜂窝网络时。
主要工作代码部分:
// Network Check
public void registerNetworkCallback()
{
try {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder = new NetworkRequest.Builder();
connectivityManager.registerNetworkCallback(builder.build(),new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
Variables.isNetworkConnected = true; // Global Static Variable
}
@Override
public void onLost(Network network) {
Variables.isNetworkConnected = false; // Global Static Variable
}
}
);
Variables.isNetworkConnected = false;
}catch (Exception e){
Variables.isNetworkConnected = false;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是当我们切换到 wifi 时,它由于某种原因在调用 onAvailable 后调用了 onLost。因此将静态变量的值设置为 false。即使网络已连接。
这是网络切换到wifi时的调试登录:
2019-11-23 16:54:29.136 8416-8459/com.example.simplenetwork D/FLABS:: onAvailable
2019-11-23 16:54:29.136 8416-8459/com.example.simplenetwork D/FLABS:: onCapabilitiesChanged
2019-11-23 16:54:29.136 8416-8459/com.example.simplenetwork D/FLABS:: onLinkPropertiesChanged
2019-11-23 16:54:29.136 8416-8459/com.example.simplenetwork D/FLABS:: onBlockedStatusChanged
2019-11-23 16:54:29.307 8416-8459/com.example.simplenetwork D/FLABS:: onLosing
2019-11-23 16:54:29.325 8416-8459/com.example.simplenetwork D/FLABS:: onCapabilitiesChanged
2019-11-23 16:54:29.371 8416-8459/com.example.simplenetwork D/FLABS:: onLost
2019-11-23 16:54:29.959 8416-8459/com.example.simplenetwork D/FLABS:: onLinkPropertiesChanged
2019-11-23 16:54:29.975 8416-8459/com.example.simplenetwork D/FLABS:: onLinkPropertiesChanged
2019-11-23 16:54:30.972 8416-8459/com.example.simplenetwork D/FLABS:: onLinkPropertiesChanged
2019-11-23 16:54:31.693 8416-8459/com.example.simplenetwork D/FLABS:: onLinkPropertiesChanged
2019-11-23 16:54:32.053 8416-8459/com.example.simplenetwork D/FLABS:: onCapabilitiesChanged
Run Code Online (Sandbox Code Playgroud)
我正在尝试添加额外的检查,onCapabilitiesChanged()但到目前为止,没有任何事情可以在不破坏其他事情的情况下解决问题。
您可以在https://gist.github.com/PasanBhanu/730a32a9eeb180ec2950c172d54bb06a上查看完整的代码(以及相关的进度/讨论)
我的代码版本(包含完整的调试过程)作为一个干净的单独项目,仅用于测试,位于https://gist.github.com/Abhinav1217/0ff6b39e70fa38379d61e85e09b49fe7 上。
PS:有人可以为这个问题提出更好的标题,更合乎逻辑的东西吗?
tldr:使用registerDefaultNetworkCallback而不是registerNetworkCallback简单的连接解决方案。
我终于开了一张 Google Android bug tracker 的票。他们解释了为什么registerNetworkCallback这样工作,对于简单的互联网连接,他们告诉我改用registerDefaultNetworkCallback。在原始要点https://gist.github.com/PasanBhanu/730a32a9eeb180ec2950c172d54bb06a上讨论了更多选项, 感谢 github 和 stackoverflow 上的精彩社区。