我有一个运行两个asynctasks的服务。一个用于接收多播数据包,另一个用于接收udp数据包。我已经注册了一个wifi状态监听器,并希望在与接入点的连接丢失时停止侦听数据包。但是当我尝试关闭其中一个套接字并尝试结束while循环时,服务本身就会关闭。我希望服务在整个时间内运行,直到我的活动退出。 以下是我的代码的相关部分。托架可能放错地方......
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 :(得分:0)
正常停止或异常停止?
你正在其中一个AsyncTasks的postExecute()中调用stopSelf()。如果你得到一个异常,你的while(true)...循环将退出,然后调用postExecute(),调用stopSelf()。这可能是原因,但由于您没有记录异常,因此无法知道。
答案 1 :(得分:-1)
AsyncTask只能在UI线程上运行。