java - Android socket.close() 导致 "the system call was canceled"?

标签 java android multithreading exception android-lifecycle

我的 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()

最佳答案

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

关于java - Android socket.close() 导致 "the system call was canceled"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8960776/

相关文章:

java - 尝试在 Swing worker 体内绘制矩形

java - Primefaces 3.0 : TreeNode and ContextMenu

Android Ndk(未找到 xxxxx 的实现)

java - 为什么我的 setVisibility View 无法正确显示?

android - appUpdateInfo.isUpdateTypeAllowed (AppUpdateType.IMMEDIATE) 在 Android In-App Update API 中的作用是什么?

java - 使用fixedRate调度的Spring 3似乎在某个点后意外停止执行,如何调试?

c# - C# 控制台应用程序中的调度程序问题

java - Eclipse - 导入 j2me 项目

java - 匿名可运行类中的变量是否始终线程安全?

c# - 线程锁和静态构造函数