Android 服务区e和xEC;应用程序执行
你好,我在服务方面有问题。 我正在制作一个应用程序,它实现一个UDPServer,并在收到的数据包中登录主活动。我希望即使活动已关闭,服务也能启动,所以我想我必须使用服务。这是真的吗? 我已经意识到一个应用程序实现了一个音乐播放器服务没有问题,但是当在服务启动函数中插入UDP服务器的代码时,我的应用程序崩溃了。 这是关于udp服务器的代码:Android 服务区e和xEC;应用程序执行,android,service,qudpsocket,Android,Service,Qudpsocket,你好,我在服务方面有问题。 我正在制作一个应用程序,它实现一个UDPServer,并在收到的数据包中登录主活动。我希望即使活动已关闭,服务也能启动,所以我想我必须使用服务。这是真的吗? 我已经意识到一个应用程序实现了一个音乐播放器服务没有问题,但是当在服务启动函数中插入UDP服务器的代码时,我的应用程序崩溃了。 这是关于udp服务器的代码: InetAddress serverAddr = InetAddress.getByName(SERVERIP); //Cre
InetAddress serverAddr = InetAddress.getByName(SERVERIP);
//Create the socket using the serverAddress
//notifica("STARTING SERVER!", "UDP***Creating server" );
//System.out.println("UDP***Creating server");
DatagramSocket socket = new DatagramSocket(SERVERPORT, serverAddr);
//create a buffer to copy packet contents into
byte[] buf = new byte[260];
//create a packet to receive
DatagramPacket packet = new DatagramPacket(buf, buf.length);
notifica("START!", "Server started!" );
while(true) {
try{
socket.receive(packet);
System.out.println("UDP***" + new String(packet.getData()));
notifica("RECEIVED!", new String(packet.getData()) );
} catch (Exception e) {
notifica("EXC_INT:", "UDP Received Exception! " + e.toString() );
}
}
我认为问题在于指挥部:
socket.receive(packet);
它阻止执行并等待读取内容。
我希望主程序不会阻止等待服务
我尝试在服务中插入超时和休眠命令,但没有任何结果:
InetAddress serverAddr = InetAddress.getByName(SERVERIP);
//Create the socket using the serverAddress
//notifica("STARTING SERVER!", "UDP***Creating server" );
//System.out.println("UDP***Creating server");
DatagramSocket socket = new DatagramSocket(SERVERPORT, serverAddr);
//create a buffer to copy packet contents into
byte[] buf = new byte[260];
//create a packet to receive
DatagramPacket packet = new DatagramPacket(buf, buf.length);
notifica("START!", "Server started!" );
while(true) {
try{
socket.setSoTimeout( 100 );
socket.receive(packet);
System.out.println("UDP***" + new String(packet.getData()));
notifica("RECEIVED!", new String(packet.getData()) );
} catch (SocketTimeoutException e) {
//notifica("EXC:", "UDP No data received!" );
//Toast.makeText(getApplicationContext(), "UDP No data received!", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
notifica("EXC_INT:", "UDP Received Exception! " + e.toString() );
}
try{
Thread.sleep(30000);
} catch (Exception e) {
notifica("EXC_INT_TIMER:", "Thread sleep exc! " + e.toString() );
}
}
谢谢 如果不希望主程序在socket.receive(packet)上阻塞,则必须实现线程化 一种方法是将阻止代码放在下面: 新线程(){ //例如,在这里放置阻塞代码 while(true){ }.start() 另外,如果您设置了超时和睡眠来解决问题,那么请将其删除,因为它不会解决崩溃问题
public void run(){
try{
socket.setSoTimeout( 100 );
socket.receive(packet);
System.out.println("UDP***" + new String(packet.getData()));
notifica("RECEIVED!", new String(packet.getData()) );
} catch (SocketTimeoutException e) {
//notifica("EXC:", "UDP No data received!" );
//Toast.makeText(getApplicationContext(), "UDP No data received!", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
notifica("EXC_INT:", "UDP Received Exception! " + e.toString() );
}
try{
Thread.sleep(30000);
} catch (Exception e) {
notifica("EXC_INT_TIMER:", "Thread sleep exc! " + e.toString() );
}
}
}