Android - 监测网络连接状态

3
在我们的应用程序中,我们希望能够不断检查连接状态,如果连接失效,则抛出Toast或某种UI来向用户指示它已经失效。我尝试在我们的Retrofit Api-Builder类中进行此操作,但似乎那里不支持Toast(会导致崩溃)。
iOS具有监控功能,但在Android上,我们必须手动检查。鉴于有多个活动,是否有一种简单/清晰的方式来在整个应用程序中执行此操作?
3个回答

0
这是我用来监控网络连接状态的方法。新建一个Java类,并命名为NetworkStateChangeReceiverNetworkStateChangeReceiver
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();

你可以使用简单的AlertDialog或Toast来显示消息。我曾经使用SweetAlertDialog库来获得更清晰的用户界面。

0

我之前看到过这个,但是我不确定如何具体实现它。当我实现清单条目时,我没有看到“CONNECTIVITY_ACTION”可用。 - svguerin3
从api 24及以上版本开始,在清单文件中隐式注册的CONNECTIVITY_ACTION接收器将不会被调用。因此,您应该通过Context.registerReceiver进行注册。所有这些都在我在原始答案中提供的文档中有说明。 - TrevJonez

0
使用广播接收器,以便在连接发生更改时触发它。

我已经研究过了,但是没有一个可靠的方法可以告诉应用程序连接何时发生变化。当我尝试将“CONNECTIVITY_ACTION”添加到我的清单中时,它并不存在。我错过了什么吗? - svguerin3
你在清单文件中定义了接收器吗? - Bapusaheb Shinde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接