4

我正在编写一个android APP。

当单击“自动扫描”按钮时,我有一个对 Pinging 254 IPv4 和将连接的机器放入数据库表(放置 ip)负责的活动。//------------------------------------------------ ---------------------

首先我获得本地 IP(例如 192.168.1.8),然后当单击按钮时,我从 ip 中提取一个子字符串(例如 192.168.1.),然后开始 ping 从“192.168.1.1”开始的所有 IP 和以“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;
        }
    }
4

1 回答 1

1

我在网上搜索,我发现在 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;
    }
}
于 2014-03-18T18:33:42.510 回答