【问题标题】:Android: Terminating a thread with a socket connectionAndroid:使用套接字连接终止线程
【发布时间】:2011-12-10 23:44:12
【问题描述】:

我有一个线程用于维护与服务器的连接。如果用户在应用程序上退出服务(但没有退出应用程序),我需要一种方法来终止线程并确保它真的消失了。就目前而言,与服务器的连接是通过长轮询(又名 Comet 架构)完成的。如果我使用“中断”来终止线程,仍然会建立与服务器的底层连接。线程始终保留在内存中。似乎没有任何方法可以强制关闭套接字。

如果用户在退出后立即重新登录,则会与服务器建立新连接。但是,由于未释放套接字,旧连接仍处于活动状态。我发现如果我转到 Android 的设置 > 应用程序 > 管理应用程序并强制应用程序关闭并重新启动它,连接线程实际上已终止并且我再次连接到服务器没有问题。

有没有办法在退出后终止线程,使其真的被强制终止?使用 System.GC() 没有帮助。

【问题讨论】:

    标签: android multithreading terminate


    【解决方案1】:

    我所做的是添加一个名为 killRequest 的布尔标志或合并到长时间运行循环中的东西。例如:

    //long running loop in thread:
    while (someMainLoopCondition && !killRequest)
    {
         //do stuff;
    
    }
    

    同时创建一个方法来更改线程内的标志:

    public requestTermination()
    {
         killRequest = true;
    }
    

    然后就可以调用了

    myThread.requestTermination();
    

    或为您创建一个清理方法:

    private void KillNetworkThread(boolean b)
                {
                        if (nThread != null) { // If the thread is currently running, close the socket and interrupt it.
                                try {
                                        nThread.requestTermination();
                                        nis.close();
                                        nos.close();
                                        nsocket.close();
                                } catch (Exception e) {
                                }
                                Thread moribund = nThread;
                                nThread = null;
                                moribund.interrupt();
                        }
    
                }
    

    这终于解决了我挥之不去的线程问题。希望这会有所帮助!

    【讨论】:

    • 对不起,我没有指出我正在使用 HttpClient,所以我没有直接访问套接字的权限。我尝试使用 httpClient.getConnectionManager().shutdown() 但这没有帮助。
    • 您可以发布与您的问题相关的代码吗?您现在如何尝试关闭此线程?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多