Android - 监控互联网连接状态

Android - Monitoring internet connection status

在我们的应用程序中,我们希望能够持续检查连接状态,如果它出现故障,则抛出一个 Toast 或某种 UI 以向用户表明它已断开。每当进行 API 调用时,我都尝试在我们的 Retrofit Api-Builder class 中执行此操作,但它似乎不喜欢那里的 Toasts(导致崩溃)。

iOS有监控功能,但是好像在Android上,得手动查看。如果有多个活动等,是否有 simple/clean 在我们的应用程序中执行此操作的方法?

您可以注册一个广播接收器,它将被告知连接变化。

信息在Monitor for Changes in Connectivityheader下。 https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html

使用广播接收器,以便在连接发生变化时触发

这就是我监控互联网连接状态的方式。创建一个 Java class 并将其命名为 NetworkStateChangeReceiver.

NetworkStateChangeReceiver

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import static android.content.Context.CONNECTIVITY_SERVICE;

public class NetworkStateChangeReceiver extends BroadcastReceiver {
public static final String NETWORK_AVAILABLE_ACTION = "yourapp.packagename.NetworkAvailable";
public static final String IS_NETWORK_AVAILABLE = "isNetworkAvailable";

@Override
public void onReceive(Context context, Intent intent) {
    Intent networkStateIntent = new Intent(NETWORK_AVAILABLE_ACTION);
    networkStateIntent.putExtra(IS_NETWORK_AVAILABLE,  isConnectedToInternet(context));

LocalBroadcastManager.getInstance(context).sendBroadcast(networkStateIntent);
}

private boolean isConnectedToInternet(Context context) {
    try {
        if (context != null) {
            ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            return networkInfo != null && networkInfo.isConnected();
        }
        return false;
    } catch (Exception e) {
        Log.e(NetworkStateChangeReceiver.class.getName(), e.getMessage());
        return false;
    }
}
}

在您的 MainActivity 中,添加以下行。

IntentFilter intentFilter = new 
IntentFilter(NetworkStateChangeReceiver.NETWORK_AVAILABLE_ACTION);
    LocalBroadcastManager.getInstance(this).registerReceiver(new 
BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            boolean isNetworkAvailable = intent.getBooleanExtra(IS_NETWORK_AVAILABLE, false);
            String networkStatus = isNetworkAvailable ? "Connected!" : "Disconnected!";

            final SweetAlertDialog CC = new SweetAlertDialog(MainActivity.this, SweetAlertDialog.WARNING_TYPE);
            CC.setTitleText("Network Status");
            CC.setContentText(networkStatus);
            CC.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
            CC.setCancelable(false);
            CC.show();

您可以使用简单的警报对话框或吐司来显示消息。我曾使用 SweetAlertDialog Library 清洁剂 UI。