private boolean DEBUG = true;
private Runtime runtime = null;
private Context context;
private int RES_OK = 100;
private int RES_ERROE = 101;
private boolean resOK = false;
private int test_OK = 1;
private int test_ERROE = 0;
private Handler flashhandler = new Handler();
private MyTask mtask;
protected void onResume() {
super.onResume();
mtask = new MyTask();
mtask.execute();
}
//在异步开机线程来测试ping,不然会阻塞ui线程
private class MyTask extends AsyncTask<String, Integer, Void>{
@Override
protected Void doInBackground(String... params) {
while(true) {
pingCustomerServer();
try {
Thread.sleep(13*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
private boolean pingCustomerServer(){
String line = null;
BufferedReader buf = null;
Process pro = null;
int count=0;
//自定义的标志
resOK = Settings.System.getInt(context.getContentResolver(), "network.customer.service", test_ERROE) == test_OK?true:false;
Log.e("testFlash", "pingCustomerServer resOK:"+resOK);
if(resOK) {
if(runtime!=null) runtime.exit(0);
runtime = null;
}else {
if(runtime == null){
runtime = Runtime.getRuntime();
}
}
//在ping过程中可能会断掉,这个时候测试的buf就是空的
//在ping过程断掉后又连上网络,会出想超过10次的情况
if(!resOK) {
try {
pro = runtime.exec("ping www.baidu.com");
buf = new BufferedReader(new InputStreamReader(
pro.getInputStream()));
while ((line = buf.readLine()) != null) {
if (DEBUG) Log.e("testFlash", "count="+ count +" line=" + line);
if(count >= 10) {
Log.e("testFlash", "checkResult connect =10" );
if(checkResult(line)) {
Log.e("testFlash", "checkResult OK" );
resOK = true;
Settings.System.putInt(context.getContentResolver(), "network.customer.service", test_OK);
handler.sendEmptyMessage(RES_OK);
return true;
}else{
handler.sendEmptyMessage(FLASH_LED);
return false;
}
}
else {
if(count > 10) {
if(checkResult(line)) {
Log.e("testFlash", "checkResult connect >10" );
//这里能停止runtime
runtime.exit(0);
runtime = null;
resOK = true;
Settings.System.putInt(context.getContentResolver(), "network.customer.service", test_OK);
handler.sendEmptyMessage(RES_OK);
return true;
}else{
handler.sendEmptyMessage(FLASH_LED);
return false;
}
}
}
count ++ ;
}
if(((line = buf.readLine()) == null)){
Log.e("testFlash", "unable to connect" );
handler.sendEmptyMessage(FLASH_LED);
return false;
}
}catch (Exception e){
Log.d("testFlash","Exception:"+e.toString());
return false;
}finally {
try {
buf.close();
pro.destroy();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
}
return false;
}
ping 返回的数据格式
from 14.215.177.38: icmp_seq=1 ttl=54 time=7.73 ms
from 14.215.177.38: icmp_seq=2 ttl=54 time=7.47 ms
from 14.215.177.38: icmp_seq=3 ttl=54 time=7.65 ms
//这里连续10次后检测结果
private boolean checkResult(String line){
/*String strs[] = line.split(" ");
for(int i=0;i < strs.length;i++){
Log.d("getstr","string:"+strs[i]);
}
String strCount = strs[4];//"icmp_seq=10"
Log.d("getstr","find the str:"+strCount);
String counts[] = strCount.split("=");
int num = Integer.parseInt(counts[1]);
if(num >= 10){
Log.d("getstr","find the count:"+num);
return true;
}else {
return false;
}*/
if(count >=10){
if(line.contains("icmp_seq=") && line.contains("ttl=")){
Log.e(TAG, "find string runtime stop" );
//msgHandler.sendEmptyMessage(StopFlash);
resOK = true;
break;
}else{
//msgHandler.sendEmptyMessage(Flashing);
resOK = false;
break;
}
}
count ++ ;
return resOK ;
}
//检测成功后停止 后台
mtask.cancel(true);
//同时停止runtime,不然会一直在后台
runtime.exit(0);
runtime=null;
记录:AsyncTask后台服务ping网络检测
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 概述:本系列文章将从开发者角度梳理开发实时联网游戏后台服务过程中可能面临的挑战,并针对性地提供相应解决思路,期望帮...
- 你好,我是老盖,首先感谢你观看本文,本篇文章我做的有视频,视频讲述的比较详细,也可以看我发布的视频。 这里演示一下...