每5秒Ping一次-Android

每5秒Ping一次-Android,android,multithreading,ping,Android,Multithreading,Ping,我已经为PING端口6789上的c类ip地址编写了这段代码,当我单击一个名为PING的按钮时,线程启动,它将检索所有打开端口6789的ip地址。。。但我需要的是每隔5秒刷新(重新ping),并添加最近加入的IP(如果存在),忽略离开端口的IP。 我调试和搜索了几个小时,但没有希望 提前感谢:DD Thread pingo = new Thread(new Runnable() { public void run() { if (reada

我已经为PING端口6789上的c类ip地址编写了这段代码,当我单击一个名为PING的按钮时,线程启动,它将检索所有打开端口6789的ip地址。。。但我需要的是每隔5秒刷新(重新ping),并添加最近加入的IP(如果存在),忽略离开端口的IP。 我调试和搜索了几个小时,但没有希望

提前感谢:DD

Thread pingo = new Thread(new Runnable() {
            public void run() {

                if (readableNetmask.equals("255.255.255.0")) {

                    for (int i = 2; i <= 254; i++) {

                        String ip_address = readableIPAddress;
                        String oct1 = "", oct2 = "", oct3 = "", oct4 = "";

                        StringTokenizer stok = new StringTokenizer(
                                ip_address, ".");

                        while (stok.hasMoreTokens()) {
                            oct1 = stok.nextToken();
                            oct2 = stok.nextToken();
                            oct3 = stok.nextToken();
                            oct4 = stok.nextToken();
                        }

                        to_ping_ip = oct1 + "." + oct2 + "." + oct3 + "."
                                + String.valueOf(i);

                        if (pingAddress(to_ping_ip, 6789)) {
                            handler.post(new UpdateIPListViewRunnable());
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                            // ips_List.add(to_ping_ip);
                        }

                    }
                }

            }
        });

        pingo.start();
显示地址的列表:

static public class UpdateIPListViewRunnable implements Runnable {
    public void run() {
        arrayAdapter.add(to_ping_ip);
        arrayAdapter.notifyDataSetChanged();
    }
}

只需添加一个包含5秒睡眠的循环,如图所示。我想您已经可以将ping的新结果集成到以前捕获的数据中了

Thread pingo = new Thread(new Runnable() {
        public void run() {
            while (true) {
                if (readableNetmask.equals("255.255.255.0")) {
                    // keep the above logic
                }

                // delay 5 seconds
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    break;
                }
            }
        }
    });

    pingo.start();
这应该对你有帮助

private void doPing() {
    if (readableNetmask.equals("255.255.255.0")) {
    // Your logic 
    }
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            doPing();
        }
    }, 5*1000);
}

您的代码中似乎没有任何“在5秒钟内再做一次”的内容,这使得您很难理解您尝试了什么。您的问题是关于在5秒钟内重试,还是仅仅是为了让单个ping正常工作?请说得更简洁一些。抱歉说得含糊不清,但我没有提到我已经试过了(我已经搜索过了)。我有这段代码,它可以为每个ip(1-254)进行一次ping,但我希望它每5秒自动ping一次,以便更新加入、离开或仍在该端口上的ip。。。谢谢你的意思是
线程。睡眠(5000)
5秒钟。非常感谢,我很感激;Dmmm不幸地出现了另一个问题:(…当我启动应用程序时,while的第一次迭代(true)工作正常,它会添加任何打开6789端口的ip,当其他设备加入该端口时,我的手机会将其添加到列表中……但在第二次迭代中,当ping到以前ping过的ip时……套接字将抛出IOException(如代码中所述)我不知道为什么:<???这会起作用,但是会导致在UI线程上执行后续的
掺杂()
调用。如果
掺杂()
改为启动一个新线程来执行ping逻辑会更好。如果我们不想在
掺杂()
中执行任何UI操作,您的逻辑会更好。接受!
private void doPing() {
    if (readableNetmask.equals("255.255.255.0")) {
    // Your logic 
    }
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            doPing();
        }
    }, 5*1000);
}