我有一个应用程序需要通过GPRS或EDGE以某种随机间隔与服务器通信。但是当用户正在通话或停用时,应用程序无法访问互联网的可能性很小。时间我有两个场景的可恢复和不可恢复。
可恢复的方案
不可恢复的情景
当其可恢复时,我可以在一些定义的间隔后再次尝试连接。在不可恢复期间,我必须提醒用户。例如,如果用户停用数据连接或启用航班模式,我必须提醒用户。
编辑:我可以通过其中一个意图检测飞行模式。我无法找到其他人。
答案 0 :(得分: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;
}
答案 1 :(得分: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...
}
}
例外只是示例,并且可能不存在,从Android Developer Docs获取您想要捕获的异常,或者在每次连接到时重新执行时查看LogCat的输出服务器会失败。