【问题标题】:Checking Online Connectivity Always Returns True检查在线连接总是返回 True
【发布时间】:2017-02-19 11:48:32
【问题描述】:

我在我的主活动中设置了一个动态广播接收器,它应该在我的网络状态发生变化时显示一条 Toast 消息。我在线连接,运行应用程序,“你在线!” Toast 消息显示,然后我关闭笔记本电脑上的互联网,导航回我的主要活动,我不断收到相同的“你在线!”吐司。我正在检查我的日志语句和我的 NetworkInfo 对象不断返回我确实在线,而我显然不在线。我在我的模拟器和手机上试过这个。有谁知道为什么?

这是我的主要活动,其中包含我的嵌套广播接收器类、意图过滤器和执行 Toast 的方法:

public class MainActivity extends AppCompatActivity {
private IntentFilter onlineIntentFilter;
private CheckOnlineReceiver checkOnlineReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    onlineIntentFilter = new IntentFilter();
    checkOnlineReceiver = new CheckOnlineReceiver();
    onlineIntentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);

    }


@Override
protected void onResume() {
    super.onResume();
    registerReceiver(checkOnlineReceiver, onlineIntentFilter);
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(checkOnlineReceiver);
}


public void isNetworkAvailable() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = cm.getActiveNetworkInfo();
    Log.v("TAG", "NETWORK INFO =========== " + networkInfo);
    if (networkInfo != null && networkInfo.isConnected()) {
        Toast.makeText(this,"You Are Online!",Toast.LENGTH_LONG).show();
    }else{
        Toast.makeText(this,"You Are Not Online!",Toast.LENGTH_LONG).show();
    }
}
private class CheckOnlineReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        boolean stateChanged = (action.equals(ConnectivityManager.CONNECTIVITY_ACTION));
        if (stateChanged){
            isNetworkAvailable();
        }
    }
}}

【问题讨论】:

    标签: android broadcastreceiver android-connectivitymanager


    【解决方案1】:

    我将这样做:

    private class CheckOnlineReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(TAG, "onReceive action: " + intent.getAction());
            Log.d(TAG, "onReceive component: " + intent.getComponent());
            NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
            stateChanged = networkInfo != null && networkInfo.isConnectedOrConnecting();
    
        if (stateChanged) {
            Toast.makeText(this,"You Are Online!",Toast.LENGTH_LONG).show();
        }else{
            Toast.makeText(this,"You Are Not Online!",Toast.LENGTH_LONG).show();
           }
        }
    }
    

    用以下代码替换您的接收器代码:

    registerReceiver(
                checkOnlineReceiver,
                new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
        );
    

    【讨论】:

    • 不幸的是仍然得到相同的结果
    【解决方案2】:

    您是否尝试在模拟器上关闭 WiFi 并查看会发生什么? networkInfo.isConnected() 不检查互联网。这只是意味着有一个活动的连接。

    【讨论】:

    • 我应该使用其他方法吗?
    • 我自己做的是 Google 和 Apple 分别检查 Android 和 iOS 上的 Internet 连接性:尝试访问向您发送特定响应代码的 Web 服务。如果失败,则没有 Internet 连接。如果你得到了你所期望的,那就是互联网连接。如果您得到的响应与您的预期不同,那么中间会有一个 Captive 门户。
    • @MarkF 查看这个类似问题中接受的答案:stackoverflow.com/questions/6493517/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多