【问题标题】:Efficient approach to continuously check whether internet connection is available in Android [duplicate]持续检查Android中互联网连接是否可用的有效方法[重复]
【发布时间】:2012-09-24 18:21:00
【问题描述】:

可能重复:
How can I monitor the network connection status in Android?

我需要不断检查互联网是否连接,并使用适当的消息相应地更新文本区域。现在,如果我创建一个 asynctask 它将执行一次并停止,这不是我想要的。我想随时检查,显然这不应该在主线程上。所以 Service 也不是一个好的选择。任何人都可以帮助我处理这个问题的最佳和有效方法是什么。谢谢

【问题讨论】:

    标签: java android service android-asynctask


    【解决方案1】:

    用接收器来做。您可以收到有关网络状态更改的通知。例如,

    private BroadcastReceiver networkReceiver = new BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
         super.onReceive(context, intent);
         if(intent.getExtras()!=null) {
            NetworkInfo ni=(NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO);
            if(ni!=null && ni.getState()==NetworkInfo.State.CONNECTED) {
                // we're connected
            }
         }
         // we're not connected 
       }
    }
    

    在您的 onResume() 注册,然后在 onPause() 取消注册。

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(networkReceiver);
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(networkReceiver, filter);
    }
    

    此外,要在您的接收器注册之前获取初始状态,请在您的 onResume() 方法中调用它,

    public boolean isNetworkConnected() {
            ConnectivityManager cm =
                (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            if (netInfo != null && netInfo.isConnectedOrConnecting()) {
                return true;
            }
            return false;
        }
    

    确保您的应用请求此权限,

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    

    【讨论】:

    • 当我打开和关闭我的 wifi 时广播接收器不工作。 Onresume 代码运行良好,但广播接收器没有通知我任何更改。有什么帮助吗?
    • 我刚刚发现了错误,谢谢!
    • @jeffrey 嘿,我使用您的代码检查互联网连接。但是在 orResume() 方法中出现错误.. registerReceiver(networkReceiver);在此方法 registerReceiver 中要求 2 个参数。 1 用于广播接收器对象,@ 用于意图过滤器。我通过了 2?
    • 很好的答案!我不需要isNetworkConnected() 方法,因为registerReceiver 总是在第一次被注册时触发onReceive()
    【解决方案2】:

    您无需不断询问操作系统是否有网络连接。只需检查onResume() 中是否存在连接,然后在连接更改时使用BroadcastReceiver 从ConnectivityManager 监听CONNECTIVITY_ACTION Intent 并检查EXTRA_NO_CONNECTIVITY

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      相关资源
      最近更新 更多