0

我正在编写一个服务意图,它扫描网络以查找来自网络上另一台设备的 UDP 广播。当找到设备时,它会向主要活动发送一条消息,然后它会做它的事情。问题是我需要为此扫描设置某种超时,所以如果它在一定时间后没有找到设备,我可以告诉主要活动。我的第一个想法是使用倒数计时器,但它不起作用。这是扫描广播的方法的代码

public void getIP()
    {
        new CountDownTimer(5000, 1000){

            @Override
            public void onFinish() {
                // TODO Auto-generated method stub
                System.out.println("Timer Finished");

            }

            @Override
            public void onTick(long millisUntilFinished) {
                // TODO Auto-generated method stub

            }

        }.start();
        try {
            UDPSocket = new DatagramSocket(55555, InetAddress.getByName("255.255.255.255"));
            UDPSocket.setBroadcast(true);
            byte[] buf = new byte[512];
            DatagramPacket packet = new DatagramPacket(buf, buf.length);
            while(shouldContinue){
                try {
                    UDPSocket.receive(packet);
                    InetAddress senderAddress = packet.getAddress();
                    String Sender = senderAddress.getHostAddress();

                    UDPSocket.close();
                    shouldContinue = false;

                    pingIP(Sender);


                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
            sendIPBack("device not found local");

        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

sendIPBack 只是一个向主活动返回消息的方法。知道为什么 onFinish 和 onTick 方法从不执行吗?

谢谢

4

2 回答 2

1

所以我在这里发现了这个问题。倒数计时器没有启动实际上并不是问题,而是它在我的 UDP 侦听器的同一线程中运行,该侦听器正在锁定线程。您绝对可以在服务或意图服务中运行倒数计时器。希望这对将来的某人有所帮助。

于 2013-02-01T17:36:29.853 回答
0

据我所知,这归结为 IntentService 的工作原理。基本上,当您启动 IntentService 时,它​​会创建一个工作线程来完成它需要做的任何工作,然后它将自行终止。

在您的代码中,一旦 doWakefulWork 退出,IntentService 就会终止。因此,您的 CountDownTimer 将与 IntentService 一起终止。

如果你想做这种事情,你应该使用常规服务而不是 IntentService。

于 2015-01-17T10:51:06.237 回答