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エントリが発生しますが、なぜですか?

UPDATE
おそらく、close()が現在「受信」でブロックされているすべてのスレッドでSocketExceptionsをスローするため、Dalvikはこれをエラーとして認識しますが、この例外がこの問題に関連しているかどうかはわかりません。

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

4

1 に答える 1

0

runメソッドのreceive()呼び出しをSocketException try..catchで囲むと、エラーは発生しなくなります。私の例外処理には、このエラーを引き起こすいくつかの副作用があったと思います。

于 2012-01-22T14:53:57.267 に答える