0

我有一个应用程序需要通过 GPRS 或 EDGE 以某个随机间隔与服务器通信。但是当用户正在通话或停用等时,应用程序无法访问互联网的可能性很小。此时我有两种情况的可恢复和不可恢复。

可恢复的场景

  • 通话时(用户将挂断,数据连接将再次激活)
  • 无信号(有时信号可能会掉线,手机会重新收到信号)

不可恢复的场景

  • 飞行模式
  • 停用数据连接

当它可以恢复时,我可以在某个定义的时间间隔后再次尝试连接。在不可恢复期间,我必须提醒用户。例如,如果用户停用数据连接或启用飞行模式,我必须提醒用户。

编辑:我可以通过其中一种意图检测飞行模式。我无法为其他人找到。

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 and catch 来包围你的方法。如果该方法由于某种原因无法连接到您的服务器而失败,您可以从 Handler 调用 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...
    }
}

异常只是示例,可能不存在,从 Android 开发人员文档中获取您想要捕获的异常,或者通过在每次重新制定与服务器的连接时查看 LogCat 的输出失败。

于 2012-04-19T10:32:19.820 回答