我正在编写一个服务意图,它扫描网络以从网络上的另一个设备进行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方法永远不会执行吗?
由于
答案 0 :(得分:1)
所以我在这里找到了问题。倒计时器没有启动它实际上是一个问题,它是在我的UDP监听器的同一个线程中运行,它正在锁定线程。您绝对可以在服务或intentservice中运行倒数计时器。希望这可以帮助将来的某个人。
答案 1 :(得分:0)
据我所知,这归结为IntentService的工作原理。基本上,当你启动一个IntentService时,它会创建一个工作线程来完成它需要做的任何工作,然后它会自行终止。
在doWakefulWork退出后,代码中的IntentService将终止。因此,您的CountDownTimer将与IntentService一起终止。
如果你想做这种事情,你应该使用常规服务而不是IntentService。