改变方向时的Android TCP连接

改变方向时的Android TCP连接,android,tcp-ip,Android,Tcp Ip,我正在尝试开发一个简单的聊天应用程序,仅用于学习目的。 我的问题是,当屏幕方向改变时,TCP/IP连接关闭,并在方向改变后重新创建 我知道Android会破坏活动,并在改变方向时重新创建它 所以我的问题是:有可能只改变视图,而其他一切都保持不变 谢谢您可以使您的连接处于静态状态,也可以在连接处于静态状态时不重新创建连接!=null,或者更好地将其包装到一个单独的类中,该类使用单例模式您想阅读文档中名为自己处理配置更改的部分。简而言之,您告诉it部门您将通过在AndroidManifest中的Ac

我正在尝试开发一个简单的聊天应用程序,仅用于学习目的。 我的问题是,当屏幕方向改变时,TCP/IP连接关闭,并在方向改变后重新创建

我知道Android会破坏活动,并在改变方向时重新创建它

所以我的问题是:有可能只改变视图,而其他一切都保持不变


谢谢

您可以使您的连接处于静态状态,也可以在连接处于静态状态时不重新创建连接!=null,或者更好地将其包装到一个单独的类中,该类使用单例模式

您想阅读文档中名为自己处理配置更改的部分。简而言之,您告诉it部门您将通过在AndroidManifest中的Activity Decellation中添加
android:configChanges=“orientation | keyboardHidden”
来手动处理它们。以下是一个例子:

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">

您应该实现TCP/IP通信,这样它就不会依赖于活动的任何方向更改/其他重新创建。

只是不要从活动创建连接。 您可以改为使用应用程序:

在您的舱单中:

<application
        android:name=".MyApplication" ...>

它将被创建一次,并贯穿应用程序的整个生命周期,即使活动被破坏


另一种选择是服务。对于聊天应用程序,我会使用它,因为它将后台网络工作与UI完全分离。

好吧,这里真正的问题是您正在主UI线程上执行TCP/IP连接,这是一个糟糕的想法,因为您有可能阻止触摸事件和生成布局。如今,大多数新设备上都会抛出
NetworkOnMainThreadException
,以防止这种行为

我要做的是将TCP/IP连接包装在
线程中
,然后让
线程
使用
setRetainInstance(true)
在工作线程(非UI,不可见)
片段中执行。这将在配置更改时保护
线程
,因为即使
活动
被销毁,
片段
仍将保留在内存中。您可以阅读有关此方法的更多信息


如果TCP/IP连接需要跨多个
活动
实例存在,则应使用
服务

可能性:确定。。。但是如果用户把手机放在码头上呢?或者如果用户更改了区域设置怎么办?这将导致
活动
同样被销毁/重新创建。现在怎么办?为什么会这样?只是tcp连接必须是静态的,因此只创建一次。这就是为什么尽可能使用应用程序上下文而不是活动本身……这是一个一般性的评论。我很清楚,例如,可以将应用程序上下文用于数据库连接,这样就不会有任何活动泄漏。但我无论如何都不明白为什么在这种情况下活动会泄漏,因为打开套接字连接不需要上下文:sSocket=newsocket(hostAddr,servPort);我喜欢将应用程序上下文作为对象的持有者,但请记住,在应用程序的整个生命周期中,您可能不会使用TCP连接实例。服务肯定是一个更好的选择。请注意:在我对当前应用程序进行的一些测试中,我发现即使在
活动
堆栈仍然存在的情况下,
应用程序
实例也经常被终止(并在不久之后再次创建)。这当然是当手机长时间处于
活动
堆栈的背景下时。因此,根据我的经验,我认为
活动
类应始终检查存储在
应用程序
中的“全局”引用是否仍然存在,如果不存在,请准备再次创建它们。您描述的内容永远不会发生。当应用程序被终止(这种情况经常发生)时,属于它的活动也必须被系统终止。你有没有在你的应用程序中寻找内存泄漏,保持僵尸活动?同意-这是意外的。这发生在我的HTC One X上,在XDADevs上,它以内存不足而闻名,有时甚至会杀死启动器。我的应用程序的
应用程序
通常是在手机放置一小时或一整晚且活动堆栈位于后台时重新创建的。恢复时,最上面的
活动
将恢复,但
应用程序
是新实例。我有一个
Toast
,它告诉我什么时候
应用程序
被重新初始化,我偶尔会看到系统在后台为我的应用程序杀死并重新创建
应用程序
,而我正在做其他事情(例如网页浏览)。[TBC]关于内存泄漏,我认为没关系。我已经通过旋转方向进行了广泛的测试,并通过这种方式发现并消除了泄漏。
应用程序
类保存了大量的“单例”数据。现在,在恢复时,我的所有
活动
类必须检查
应用程序
是否存在“全局”结构,如果不存在,则触发它们的重新创建。事实上,我注意到一些应用程序(不是我自己的)在我的HTC One X上恢复堆栈时似乎失去了状态,如果它们上次使用后经过了一段时间(DI FM Radio应用程序就是一个例子)。我想我应该为这个问题创建一个单独的Stackoverflow问题。哇,这看起来像是HTC One X中的一个主要缺陷,我想知道他们是如何通过CTS的(如果有测试覆盖这个场景的话)。Google应该更严格地批准端口。我建议不要在TCP连接中使用AsyncTask,如果用户希望将AsyncTask用于其他目的,该怎么办?@KarlMorrison AsyncTasks应该用于短任务(3-4秒)。如果TCP连接需要长时间保持,那么最好使用服务。我不知道您所说的“如果用户希望将
AsyncTask
用于其他目的,该怎么办?”
<application
        android:name=".MyApplication" ...>