0

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

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

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

谢谢

4

5 回答 5

3

您应该将 TCP/IP 通信实现为服务,然后它将不依赖于任何方向更改/其他活动的重新创建。

于 2012-07-13T20:25:29.237 回答
2

您想阅读处理运行时更改文档中称为自己处理配置更改的部分。简而言之,您告诉它您将通过在 AndroidManifest 中添加到您的 Activity decleration 来手动处理它们。这是一个例子:android:configChanges="orientation|keyboardHidden"

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

然后在您的 Activity 中,您可以onConfigurationChanged像这样覆盖:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}
于 2012-07-13T20:18:20.947 回答
1

您可以将连接设为静态而不在它为 != null 时重新创建它,或者更好地将其包装到使用单例模式的单独类中

于 2012-07-13T20:16:30.720 回答
1

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

在您的清单中:

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

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

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

于 2012-07-13T20:29:14.620 回答
1

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

我要做的是将 TCP/IP 连接包装在 aThread中,然后ThreadFragment带有setRetainInstance(true). 这可以保护您Thread的配置更改,因为Fragment即使Activity被销毁,它也会保留在内存中。您可以在此处阅读有关此方法的更多信息。

如果 TCP/IP 连接需要跨多个Activity实例存在,则应使用 aService代替。

于 2012-07-13T20:30:36.257 回答