4

私はアンドロイドアプリをプログラミングしています。

ボタン「自動スキャン」がクリックされたときに、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;
        }
    }
4

1 に答える 1

1

ネットで検索したところ、Java では、ミリ秒単位のタイムアウト オプション ( -t ) を受け入れる「 fping 」というコマンドを使用している人がいることがわかりました。しかし、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;
    }
}
于 2014-03-18T18:33:42.510 に答える