我目前正在开发基于FCM(Firebase云消息)的即时消息应用程序。我的问题在于以下场景:
解决此问题的最佳方法是什么?到目前为止,我已经使用BroadcastReceiver实现了一个用于网络更改的监听器,但是,一旦wi-fi连接没有丢失,仅仅处理上述场景是不够的。
答案 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;
}