Android socket.close()导致“系统调用被取消”?

时间:2012-01-22 11:40:13

标签: java android multithreading exception android-lifecycle

我的MainActivity启动另一个名为UdpListener的线程。在onResume中,线程将被启动(这是有效的),在onPause它应该停止,但socket.close()在LogCat中引起错误消息" 系统调用被取消&#34 ;。 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" receive",但我不确定此异常是否与此问题有关。

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

1 个答案:

答案 0 :(得分:0)

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