0

GPRS または EDGE を介してランダムな間隔でサーバーと通信する必要があるアプリケーションがあります。しかし、ユーザーが通話中または非アクティブ化されている場合などに、アプリケーションがインターネットにアクセスできない可能性はほとんどありません。回復可能と回復不能の 2 つのシナリオ。

回復可能なシナリオ

  • 通話中 (ユーザーが電話を切り、データ接続が再びアクティブになります)
  • 信号がありません (信号がドロップする場合があり、電話は再び信号を受信します)

回復不可能なシナリオ

  • 機内モード
  • データ接続の無効化

回復可能な場合、定義された間隔の後に接続を再試行できます。そして、回復不能の間、ユーザーに警告する必要があります。たとえば、ユーザーがデータ接続を無効にしたり、フライト モードを有効にしたりした場合は、ユーザーに警告する必要があります。

編集: インテントの 1 つを介してフライト モードを検出できます。他の人には見つけられませんでした。

4

2 に答える 2

1

以下のコードは、有効な接続が利用可能な場合に返されます

public boolean isConnectionsAvailable() {
         boolean lRet = false;
         try{
             ConnectivityManager conMgr =  (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
             NetworkInfo info= conMgr.getActiveNetworkInfo();  
             if(info != null && info.isConnected()) {  
                 lRet = true ;
             }else{  
                 lRet = false ;
                }
         }catch (Exception e) {
             Log.d("Connection Error", e.toString());
             lRet = false ;
        }
         return lRet;
       }

この後、信号強度が低い場合は、関連するタイムアウトを設定して HTTP 要求を行います。タイムアウトが発生した場合は、以下のように関連する警告メッセージをユーザーに提供します

public void serverCall(String pURL){

   if (isConnectionsAvailable()){
     // Call server by setting proper timeout

   }

}

編集:

機内モードのステータスを確認するには:

private static boolean isAirplaneModeOn(Context context) {

   return Settings.System.getInt(context.getContentResolver(),
           Settings.System.AIRPLANE_MODE_ON, 0) != 0;

}
于 2012-04-19T10:45:41.490 に答える
0

tryとcatchでメソッドを囲んでみることができます。何らかの理由でサーバーに接続できないためにメソッドが失敗した場合は、ハンドラーからpostDelayedを呼び出して、事前に決められた時間内にメソッドを再実行できます。

Handler mHandler = new Handler();
Runnable yourMethodRunnable = new Runnable(){
    @Override
    public void run(){
        yourMethod();
    }
};

private void yourMethod(){
    try{
        // talk to server
    } catch (InCallException e) {
        mHandler.postDelayed(yourMethodRunnable, delay)
    } catch (NoSignalException e) {
        // etc...
    } catch (OtherException e) {
        // etc...
    }
}

例外は単なる例であり、存在しない可能性があります。AndroidDeveloper Docsから、またはサーバーへの接続が行われるたびに再制定するときにLogCatからの出力を確認することにより、キャッチしたい例外を取得します。不合格。

于 2012-04-19T10:32:19.820 に答える