Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 停止AsyncTask会导致服务结束_Android_Multithreading_Networking_Service_Android Asynctask - Fatal编程技术网

Android 停止AsyncTask会导致服务结束

Android 停止AsyncTask会导致服务结束,android,multithreading,networking,service,android-asynctask,Android,Multithreading,Networking,Service,Android Asynctask,我有一个运行两个异步任务的服务。一个用于接收多播数据包,另一个用于接收udp数据包。我已注册wifi状态侦听器,并希望在与接入点的连接丢失时停止侦听数据包。但当我尝试关闭任何一个套接字并尝试结束while循环时,服务本身就会关闭。我希望服务在活动退出之前的整个时间内一直运行。 以下是我的代码的相关部分。括号可能放错地方了 public class ReceiveService extends Service { private Receive r; private ReceiveMultica

我有一个运行两个异步任务的服务。一个用于接收多播数据包,另一个用于接收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();
    }
}

}
公共类ReceiveService扩展服务{
私人接收r;
私有接收多播rm;
私有布尔运行=真;
私有布尔接收=false,接收多=false;
@凌驾
公共IBinder onBind(意图arg0){
//返回活页夹;
返回null;
}
@凌驾
public void onCreate(){
试一试{
r=新接收();
rm=新的ReceiveMulticast();
if(wifi.checkwifi(this)){//检查是否连接到接入点
wifiInit();
接收();
receivemulti();
}
}捕获(例外e){
Log.d(“test”,“oncreate中的异常”);
//e、 printStackTrace();
}
}
public void wifiInit(){
wm=wifi.getWifiManager(此);
myip=wifi.getmyip(wm);
wifi.acquirelock(wm);
}
公共接收(){
r、 执行();
接收=真;
}
public void receivemulti(){
rm.execute();
receivemulti=true;
}
私有广播接收器WifiStateChangedReceiver=新广播接收器(){
@凌驾
公共void onReceive(上下文、意图){
//监视wifi状态的变化
}
};
@凌驾
公共空间{
试一试{
如果(!r.ds1.isClosed())
r、 ds1.close();
如果(!rm.s.isClosed()){
rm.s.leaveGroup(rm.group);
rm.s.close();
}
super.ondestory();
}捕获(例外e){
日志d(“测试”、“销毁中的异常”);
}
}
私有类接收扩展异步任务{
专用数据采集器ds1;
私有数据包p;
受保护的void onPreExecute(){
}
受保护的Void doInBackground(Void…参数){
试一试{
ds1=新的DatagramSocket(7777);
}捕获(SocketException e){
Log.d(“测试”,“新数据报中的异常”);
//e、 printStackTrace();
}
int buffer_size=1024;
字节缓冲区1[]=新字节[缓冲区大小];
p=新数据包(buffer1,buffer1.length);
(跑步时){
试一试{
ds1.接收(p);
字符串sip=p.getAddress().getHostAddress();
String rec=新字符串(p.getData(),0,p.getLength());
//出版进度(sip+“+”+rec);
}捕获(例外e){
运行=错误;
}
}
返回null;
}
受保护的void onProgressUpdate(字符串…进度){
//做事
}
受保护的void onPostExecute(void结果){
stopSelf();
}
}
私有类ReceiveMulticast扩展异步任务{
私有字符串ip=“224.0.0.10”;
专用int端口=6789;
专用多播;
私有数据包mp;
专用地址组;
受保护的void onPreExecute(){
}
受保护的Void doInBackground(Void…参数){
试一试{
组=InetAddress.getByName(ip);
s=新的多播套接字(端口);
s、 联合组(组);
}捕获(未知后异常e1){
Log.d(“测试”,“异常未知主机rm”);
//e1.printStackTrace();
}捕获(IOE异常){
日志d(“测试”、“异常io rm”);
//e、 printStackTrace();
}
字节[]缓冲区2=新字节[1024];
mp=新数据包(buffer2,buffer2.length);
(跑步时){
试一试{
s、 接收(mp);
字符串sip=mp.getAddress().getHostAddress();
String rec=新字符串(mp.getData(),0,mp.getLength());
//出版进度(sip+“+”+rec);
}捕获(例外e){
运行=错误;
}
}
返回null;
}
受保护的void onProgressUpdate(字符串…进度){
//做事
}
}
受保护的void onPostExecute(void结果){
stopSelf();
}
}
}

正常停止还是异常停止


您正在其中一个异步任务的postExecute()中调用stopSelf()。你的时间(真的)。。。若得到异常,循环将退出,然后调用postExecute(),调用stopSelf()。这可能是原因,但由于您没有记录异常,因此无法知道原因。

AsyncTask只能在UI线程上运行。

感谢您为我指明了正确的方向。我从某处复制了asynctask模板,但没有意识到stopself()用于停止服务而不是任务。完全忽略了它。再次感谢。你帮我节省了很多时间。。。