自分専用のユーティリティクラスを作成しました。私がネットワークコールをしたいときはいつでも、コールバックは成功か失敗かを問わずいつでも使うことができます。使用中のライブラリは、マニフェスト
<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" />
そして、サーバー要求を実行する前に確認するための条件で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();
}
私はボレーを使用しませんが、リクエストのタイムアウトイベントを受信できると確信しています。私はそれを自動的に再試行するいくつかのメカニズムを実装します。ユーザーに警告し、手動で再試行するように指示することもできます。 whatsappに基づいて、彼らが何をするかは、何かが失敗した場合に、自動的に後で自動的にリトライすることであると思います。 – Lxu
何回試してみるべきですか?もう一度送信しようとする前に待つべきですか? –