Android 如果活动HTTP调用正在运行的活动已关闭,则该调用会发生什么情况?

Android 如果活动HTTP调用正在运行的活动已关闭,则该调用会发生什么情况?,android,multithreading,apache-commons,Android,Multithreading,Apache Commons,我使用ApacheCommons进行HTTP调用,在我的活动中有一个线程进行调用。如果一个电话是由一个设备发出的,并且坐在那里等待连接(想象一下网络拥挤,通话需要一段时间),同时,用户退出应用程序,活动也会停止。我的电话怎么了?因此(仔细想想)在活动中启动的任何线程会发生什么情况?如果我有一个线程坐在那里做它的事情(不管它是什么),并且活动已关闭,那么我是否必须自己处理在pause()上终止该线程 编辑。。。 那么,根据Ted Hopp的回答,什么是终止Apache请求的正确方法?我看了一遍,有

我使用ApacheCommons进行HTTP调用,在我的活动中有一个线程进行调用。如果一个电话是由一个设备发出的,并且坐在那里等待连接(想象一下网络拥挤,通话需要一段时间),同时,用户退出应用程序,活动也会停止。我的电话怎么了?因此(仔细想想)在活动中启动的任何线程会发生什么情况?如果我有一个线程坐在那里做它的事情(不管它是什么),并且活动已关闭,那么我是否必须自己处理在pause()上终止该线程

编辑。。。
那么,根据Ted Hopp的回答,什么是终止Apache请求的正确方法?我看了一遍,有一大堆方法*看起来它们可以做到这一点,但是既然文档太缺乏细节(如果你不打算指定一些东西,为什么还要麻烦文档呢?!)我想知道在终止连接所在的线程之前,应该调用HttpConnection对象上的哪些方法?

关闭活动对承载活动的进程没有直接影响。所有其他线程继续运行。您应该重写一个或多个方法(
onPause
onDestroy
,等等),以检测活动是否正在完成并中断或以其他方式终止正在运行的线程。活动方法
isFinishing()
有助于区分正在关闭的活动和由于配置更改而被销毁和重新启动的活动

您的线程应该使用取消执行的方法写入。特别是对于apachecommons,该方法应该有两个步骤。首先,应该为传递给
HttpClient.execute()
方法的方法调用
abort()
。其次,您应该关闭连接本身:

client.getHttpConnectionManager()
    .getConnection(client.getHostConfiguration()).close();

实际上,如果您只执行最后一步,那么实际上应该足以在方法中抛出一个
IOException
,并停止所有操作。

谷歌强烈建议开发人员不要在
活动中进行HTTP调用<代码>服务
是推荐的型号。Android应用程序将因为很多很多原因而暂停。其中最常见的是接听电话、短信或电子邮件。我怀疑您是否想取消呼叫,因此当用户返回时,可能会在后台再次等待呼叫

最好的选择是使用
服务
IntentService
进行调用并保存数据(可能是保存到SQLite数据库中)。当
活动
恢复时,它可以简单地检查数据库中的新条目


如果您还没有看到它,请查看Google I/O 2010中的“”。请务必注意PDF下载链接。

太棒了。。。那么,要问我的Apache问题的细节,我该如何终止HTTP请求呢?如果线程阻塞了网络请求,最好让它自己运行,而不是主动终止线程或HTTP请求。你不仅在拯救应用程序,还可能拯救服务器。只要确保您的线程在从HTTP请求返回后优雅地退出,以发现活动已消失。@Barry Fruthman,我听到了,但在我的特定情况下,我真的不希望服务器最终被延迟的请求悄悄地击中。如果它没有客户端响应,我宁愿它没有通过。@Dr.Dredel-我编辑了我的回答,以提供Apache Commons的详细信息。谢谢,我实际上知道所有这些,但不幸的是,在这种特殊情况下,需要活动打电话,事实上,如果用户在中途离开,则需要终止连接。重要的是,在大多数情况下,响应不会被服务响应吞没,因为相同的用户不会回来(这是一个为大量分散用户使用的kiosk应用程序定制的应用程序)。所以,虽然我同意你一般论点的前提,但它不适用于我的情况。