2016-07-21 7 views
2

私は現在、FCM(Firebase Cloud Message)に基づくインスタントメッセージアプリケーションを開発中です。私の問題は、次のシナリオである:リクエストを送信する際に「インターネット接続なし」のシナリオを処理する方法は?

  1. ユーザーがintermitentネットワークに接続されている - デバイスとの接続を保持しているものの、すなわちのWi-Fi、インターネットプロバイダに随時インターネット接続が失われる可能性があります。
  2. デバイスがwi-fiに接続されているがインターネットに接続されていないときに、ユーザーがメッセージを送信しようとしました(ボレーを使用したPOSTリクエスト)。

この問題に取り組む最も良い方法は何ですか?これまでは、BroadcastReceiverを使用してネットワーク変更のリスナーを実装しましたが、wi-fi接続が失われていない場合は、上記のシナリオを処理するだけでは不十分です。

+1

私はボレーを使用しませんが、リクエストのタイムアウトイベントを受信できると確信しています。私はそれを自動的に再試行するいくつかのメカニズムを実装します。ユーザーに警告し、手動で再試行するように指示することもできます。 whatsappに基づいて、彼らが何をするかは、何かが失敗した場合に、自動的に後で自動的にリトライすることであると思います。 – Lxu

+0

何回試してみるべきですか?もう一度送信しようとする前に待つべきですか? –

答えて

3

自分専用のユーティリティクラスを作成しました。私がネットワークコールをしたいときはいつでも、コールバックは成功か失敗かを問わずいつでも使うことができます。使用中のライブラリは、マニフェスト

<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(); 
} 
+0

ニース!だから、彼にもう一度やり直したいのかどうか聞いてみましょう。私のアプリケーションはIMなので、私はそれを自動的に再試行すると思います。私の心配は今何度、何度、何度も待ってからもう一度やり直すまでです。 –

+1

@EdgarDaSilvaFernandesそれはあなた次第です。あなたは、あなたのニーズに合わせてコードを変更することができます:) –

1

です!

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; 
} 
+0

これは、有効なインターネット接続を持っていることについて何の情報も得られないという問題がありました。なぜなら、WiFiに接続しているのは本当ですが、WiFiにはインターネットにアクセスできない可能性があるからです。 –

+0

そこに行く! – johnrao07

関連する問題