1

我的 MainActivity 启动另一个名为 UdpListener 的线程。在 onResume 中,线程将被启动(这有效),在 onPause 中它应该停止,但是 socket.close() 在 LogCat 中导致错误消息“系统调用被取消”。UdpListener 本身在 JUnit 测试中工作正常,所以这一定是某种 Android 问题。

这些是我的线程的相应方法:

private void setThreadRunning(boolean running) throws MyOwnException {
    this.running = running;

    if (running) {
        try {
            serverSocket = new DatagramSocket(9800);
        } 
        catch (SocketException e) {
            exceptionThrown = true;
            this.running = false;
            Log.e(TAG, e.getMessage());

            if (serverSocket != null && !serverSocket.isClosed())  {
                serverSocket.close();
            }

            throw new MyOwnException(e);
        }
    } 
    else {
        if (serverSocket != null && !serverSocket.isClosed())  {
            serverSocket.close();
        }
    }
}

public void stopThread() throws MyOwnException {
    setThreadRunning(false);
}

MainActivity.onPause():

@Override
public void onPause()  {
    super.onPause();

    try {
        udpListener.stopThread();
    } 
    catch (MyOwnException e) {
        //TODO AlertDialog
    }
}

else 分支的 serverSocket.close() 将被执行并导致 LogCat 条目,但为什么呢?

更新
也许 Dalvik 将此识别为错误,因为 close() 在当前阻塞在“接收”中的每个线程上抛出 SocketExceptions,但我不确定此异常是否与此问题有关。

http://docs.oracle.com/javase/1.4.2/docs/api/java/net/DatagramSocket.html#close()

4

1 回答 1

0

当我用 SocketException try..catch 包围 run 方法中的 receive() 调用时,该错误不再发生。我猜我的异常处理有一些副作用导致这个错误。

于 2012-01-22T14:53:57.267 回答