Android 服务区e和xEC;应用程序执行

Android 服务区e和xEC;应用程序执行,android,service,qudpsocket,Android,Service,Qudpsocket,你好,我在服务方面有问题。 我正在制作一个应用程序,它实现一个UDPServer,并在收到的数据包中登录主活动。我希望即使活动已关闭,服务也能启动,所以我想我必须使用服务。这是真的吗? 我已经意识到一个应用程序实现了一个音乐播放器服务没有问题,但是当在服务启动函数中插入UDP服务器的代码时,我的应用程序崩溃了。 这是关于udp服务器的代码: InetAddress serverAddr = InetAddress.getByName(SERVERIP); //Cre

你好,我在服务方面有问题。 我正在制作一个应用程序,它实现一个UDPServer,并在收到的数据包中登录主活动。我希望即使活动已关闭,服务也能启动,所以我想我必须使用服务。这是真的吗? 我已经意识到一个应用程序实现了一个音乐播放器服务没有问题,但是当在服务启动函数中插入UDP服务器的代码时,我的应用程序崩溃了。 这是关于udp服务器的代码:

    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() );
    }
} 

}