发送请求时如何处理“无互联网连接”的情况?

时间:2016-07-21 13:49:25

标签: android android-volley

我目前正在开发基于FCM(Firebase云消息)的即时消息应用程序。我的问题在于以下场景:

  1. 用户连接到一个间歇网络 - 即一个Wi-Fi,虽然与设备保持连接,但可能会不时地与互联网提供商失去互联网连接;
  2. 当设备连接到Wi-Fi但没有互联网连接时,用户尝试发送消息(使用排球的POST请求);
  3. 解决此问题的最佳方法是什么?到目前为止,我已经使用BroadcastReceiver实现了一个用于网络更改的监听器,但是,一旦wi-fi连接没有丢失,仅仅处理上述场景是不够的。

2 个答案:

答案 0 :(得分:3)

我为此创建了自己的实用程序类。每当我想进行网络呼叫时,无论何时成功或失败,我都会使用回调。正在使用的图书馆是MaterialDialog

public class NetworkUtil {

public static boolean isOnline() {
    InetAddress inetAddress = null;
    try {
        Future<InetAddress> future = Executors.newSingleThreadExecutor().submit(new Callable<InetAddress>() {
            @Override
            public InetAddress call() {
                try {
                    return InetAddress.getByName("google.com");
                } catch (UnknownHostException e) {
                    return null;
                }
            }
        });
        inetAddress = future.get(2000, TimeUnit.MILLISECONDS);
        future.cancel(true);
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    } catch (TimeoutException e) {
        e.printStackTrace();
    }
    return inetAddress != null && !inetAddress.equals("");
}


public static MaterialDialog checkConnectivity(final Activity activity, final NetworkUtilCallback callback) {
    MaterialDialog dialog = MaterialDialogUtil.builDialogPositiveNegative(activity,
            activity.getString(R.string.no_internet),
            activity.getString(R.string.instruction_no_internet),
            "RETRY",
            "CANCEL",
            new MaterialDialog.SingleButtonCallback() {
                @Override
                public void onClick(MaterialDialog dialog, DialogAction which) {
                    dialog.dismiss();
                    if (!isOnline()) {
                        checkConnectivity(activity, callback);
                    } else {
                        callback.onSuccess();
                    }
                }
            },
            new MaterialDialog.SingleButtonCallback() {
                @Override
                public void onClick(MaterialDialog dialog, DialogAction which) {
                    dialog.dismiss();
                    callback.onCancel();
                }
            });
    if (!isOnline()) {
        dialog.show();
    } else {
        callback.onSuccess();
    }

    return dialog;
}

public interface NetworkUtilCallback {
    void onSuccess();

    void onCancel();
}

答案 1 :(得分:2)

在您的清单中

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

在执行服务器请求之前要检查的条件!

public static boolean hasInternetConnection()
{
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo wifiNetwork = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (wifiNetwork != null && wifiNetwork.isConnected())
{
    return true;
}
NetworkInfo mobileNetwork = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (mobileNetwork != null && mobileNetwork.isConnected())
{
    return true;
}
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork != null && activeNetwork.isConnected())
{
    return true;
}
return false;
}
相关问题