私はアンドロイドアプリをプログラミングしています。
ボタン「自動スキャン」がクリックされたときに、Ping 254 IPv4 と接続されたマシンをデータベース テーブルに配置する (IP を配置する) というアクティビティを担当しています。//------------------------------------------------ ----------------------
最初にローカル IP (例: 192.168.1.8) を取得し、次にボタンをクリックすると、IP から部分文字列を抽出し (この例では 192.168.1.)、"192.168.1.1" から始まるすべての IP に対して ping を開始し、 「192.168.1.254」で終了します。すべてのpingの後、そのpingが成功したか失敗したかを知るためのテストを行い、成功した場合はそのIPをデータベーステーブルに入れ、最後に接続されたIPのリストをリストビューに表示します. //------------------------------------------------ ----------------------
問題は、Pinging タスクが完了するまでに時間がかかりすぎることです (約 15 分以上!!)。InetAddress.isReachable()を使ってみたところ速かったのですが、windowsで動作するパソコンが見つからないので、Process & Runtime.getRuntime().exec(cmd)で動作するように変更しました。
アンドロイドコードの下:
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;
}
}