
我有一个活动负责Pinging 254 IPv4并在点击按钮“自动扫描”时将连接的机器放入数据库表(放入ip).
// ———————————————— ———————
首先我得到本地IP(例如192.168.1.8),然后当点击按钮时,我从ip中提取一个subString(这个例子为192.168.1.)然后开始Ping所有IP,从“192.168.1.1”开始完成“192.168.1.254”.每次Ping之后,我都会做一个测试,知道Ping是成功还是失败,如果成功,那么我把那个ip放在数据库表中,然后最后我在列表视图中显示连接的IP列表.
// ———————————————— ———————
问题是Pinging任务花了太长时间才完成(大约15分钟或更长时间!!),这很疯狂.
我试图使用InetAddress.isReachable()它很快,但它找不到使用windows的计算机,所以我改为使用Process&调用Runtime.getRuntime().EXEC(CMD).
在androID代码下面:
class MyTask extends AsyncTask<String,Integer,VoID> { Dialog dialog; Progressbar progressbar; TextVIEw tvLoading,tvPer; button btnCancel; @OverrIDe protected VoID doInBackground(String... params) { Thread.currentThread().setPriority(Thread.MAX_PRIORITY); String s="",address = params[0]; int index=0,j=0,count=0; //on prend le dernIEr index du char "." final StringBuilder ss = new StringBuilder(address); index = ss.lastIndexOf("."); //on prend une souschaîne qui contIEnt l'ipv4 sans le dernIEr nombre s = address.substring(0,index+1); //Tester tous les adresses Ipv4 du même plage d'adresses for(int i=1; i<255; i++){ if (isCancelled()) { break; } if(testPing(s+""+i+"")){ insertIPv4(s+""+i+"");} count++; if(count == 5 && j<100){ count=0; j+=2; publishProgress(j); } } return null; } @OverrIDe protected voID onPostExecute(VoID result){ super.onPostExecute(result); dialog.dismiss(); AlertDialog alert = new AlertDialog.Builder(Gestion_Machines.this) .create(); alert.setTitle("Terminé"); alert.setMessage("Operation Terminé avec Succés"); alert.setbutton("OK",new DialogInterface.OnClickListener() { @OverrIDe public voID onClick(DialogInterface dialog,int which) { dialog.dismiss(); } }); alert.show(); } @OverrIDe protected voID onPreExecute() { super.onPreExecute(); dialog = new Dialog(Gestion_Machines.this); dialog.setCancelable(false); dialog.requestwindowFeature(Window.FEATURE_NO_Title); dialog.setContentVIEw(R.layout.progressdialog); progressbar = (Progressbar) dialog.findVIEwByID(R.ID.progressbar1); tvLoading = (TextVIEw) dialog.findVIEwByID(R.ID.tv1); tvPer = (TextVIEw) dialog.findVIEwByID(R.ID.tvper); btnCancel = (button) dialog.findVIEwByID(R.ID.btncancel); btnCancel.setonClickListener(new OnClickListener() { @OverrIDe public voID onClick(VIEw v) { objMyTask.cancel(true); dialog.dismiss(); } }); dialog.show(); } @OverrIDe protected voID onProgressUpdate(Integer... values) { super.onProgressUpdate(values); progressbar.setProgress(values[0]); tvLoading.setText("Loading... " + values[0] + " %"); tvPer.setText(values[0]+" %"); }} 和Ping的方法:
public boolean testPing(String x){ int exit=22; Process p; try { //.....edited line..... p = Runtime.getRuntime().exec("Ping -c1 -W1 "+x); //make shure that is -W not -w it's not he same. p.waitFor(); exit = p.exitValue(); p.destroy(); } catch (IOException ee) { ee.printstacktrace(); } catch (InterruptedException e) { e.printstacktrace(); } if (exit == 0) { return true; }else{ return false; } }解决方法 我在网上搜索,我发现在java中,有些人使用了一个名为“fPing”的命令,它接受超时选项(-t)和毫秒.但androID(shell)中的Ping命令只能接受秒的超时.所以,对于我的情况,洞 *** 作应该花费254秒,不错……但不完美. public boolean testPing(String x){ int exit=22; Process p; try { //.....edited line..... p = Runtime.getRuntime().exec("Ping -c1 -W1 "+x); //make shure that is -W not -w it's not he same. p.waitFor(); exit = p.exitValue(); p.destroy(); } catch (IOException ee) { ee.printstacktrace(); } catch (InterruptedException e) { e.printstacktrace(); } if (exit == 0) { return true; }else{ return false; }} 总结 以上是内存溢出为你收集整理的在Android中ping IP列表全部内容,希望文章能够帮你解决在Android中ping IP列表所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)