0

我有一个运行两个asynctasks的服务。一个用于接收多播数据包,另一个用于接收udp数据包。我已经注册了一个wifi状态监听器,并且当连接到一个接入点丢失时想要停止监听数据包。但是,当我尝试关闭其中一个套接字并尝试结束while循环时,服务本身就会关闭。我希望服务能够在整个过程中运行,直到我的活动结束。 以下是我的代码的相关部分。支架可能会错位...停止AsyncTask导致服务结束

public class ReceiveService extends Service { 

private Receive r; 
private ReceiveMulticast rm; 
private boolean running = true; 

private boolean receive = false, receivemulti = false; 


@Override 
public IBinder onBind(Intent arg0) { 
    // return binder; 
    return null; 
} 

@Override 
public void onCreate() { 

    try { 

     r = new Receive(); 
     rm = new ReceiveMulticast(); 


     if (wifi.checkwifi(this)) {//check if connected to access point 
      wifiInit(); 
      receive(); 
      receivemulti(); 
     } 

    } catch (Exception e) { 
     Log.d("test", "exception in oncreate"); 
     //e.printStackTrace(); 
    } 

} 

public void wifiInit() { 
    wm = wifi.getWifiManager(this); 
    myip = wifi.getmyip(wm); 
    wifi.acquirelock(wm); 
} 

public void receive() { 
    r.execute(); 
    receive = true; 

} 

public void receivemulti() { 
    rm.execute(); 
    receivemulti = true; 

} 

private BroadcastReceiver WifiStateChangedReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     //monitor changes in wifi state 
    } 
}; 

@Override 
public void onDestroy() { 
    try { 
     if (!r.ds1.isClosed()) 
      r.ds1.close(); 
     if (!rm.s.isClosed()) { 
      rm.s.leaveGroup(rm.group); 
      rm.s.close(); 
     } 

     super.onDestroy(); 
    } catch (Exception e) { 
     Log.d("test", "Exception in destroy"); 
    } 
} 

private class Receive extends AsyncTask<Void, String, Void> { 

    private DatagramSocket ds1; 
    private DatagramPacket p; 

    protected void onPreExecute() { 

    } 

    protected Void doInBackground(Void... params) { 

     try { 
      ds1 = new DatagramSocket(7777); 
     } catch (SocketException e) { 
      Log.d("test", "Exception in new datagram"); 
      //e.printStackTrace(); 
     } 
     int buffer_size = 1024; 
     byte buffer1[] = new byte[buffer_size]; 
     p = new DatagramPacket(buffer1, buffer1.length); 

     while (running) { 
      try { 
       ds1.receive(p); 
       String sip = p.getAddress().getHostAddress(); 
       String rec = new String(p.getData(), 0, p.getLength()); 

       //publishProgress(sip + "+" + rec); 
      } catch (Exception e) { 

       running = false; 
      } 
     } 
     return null; 

    } 

    protected void onProgressUpdate(String... progress) { 
     //do stuff 

    } 

    protected void onPostExecute(Void result) { 
     stopSelf(); 
    } 

} 

private class ReceiveMulticast extends AsyncTask<Void, String, Void> { 

    private String ip = "224.0.0.10"; 
    private int port = 6789; 
    private MulticastSocket s; 
    private DatagramPacket mp; 
    private InetAddress group; 

    protected void onPreExecute() { 

    } 

    protected Void doInBackground(Void... params) { 

     try { 
      group = InetAddress.getByName(ip); 
      s = new MulticastSocket(port); 
      s.joinGroup(group); 
     } catch (UnknownHostException e1) { 
      Log.d("test", "exception unknown host rm"); 

      //e1.printStackTrace(); 
     } catch (IOException e) { 
      Log.d("test", "exception io rm"); 

      //e.printStackTrace(); 
     } 

     byte[] buffer2 = new byte[1024]; 
     mp = new DatagramPacket(buffer2, buffer2.length); 

     while (running) { 

      try { 
       s.receive(mp); 
       String sip = mp.getAddress().getHostAddress(); 
       String rec = new String(mp.getData(), 0, mp.getLength()); 

       //publishProgress(sip + "+" + rec); 
      } catch (Exception e) { 

       running = false; 

      } 
     } 
     return null; 
    } 

    protected void onProgressUpdate(String... progress) { 

     //do stuff 


     } 

    } 

    protected void onPostExecute(Void result) { 
     stopSelf(); 
    } 
} 

} 

回答

0

正常停止或停止异常?

您在其中一个AsyncTasks的postExecute()中调用stopSelf()。如果你得到一个异常,你的while(true)...循环会退出,然后调用postExecute(),它调用stopSelf()。这可能是原因,但由于您没有记录异常,所以无法知道。

+0

感谢您指点我正确的方向。我从某处复制了asynctask模板,但没有意识到stopself()用于停止服务而不是任务。完全忽略它。再次感谢。你为我节省了很多时间...... – madridista 2012-03-19 18:05:15

-1

AsyncTask只能在UI线程上运行。