更改方向的Android TCP连接

时间:2012-07-13 20:13:33

标签: android tcp-ip

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

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

所以我的问题是:只改变视图但其他所有内容保持不变是可行的吗?

由于

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

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

然后在您的活动中,您可以覆盖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();
    }
}

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

你的清单中的

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

它将被创建一次,并在您的应用程序的整个生命周期中生存,即使活动被破坏。

其他替代方案是服务。对于聊天应用程序,我会使用它,因为它完全从UI分离后台网络工作。

答案 4 :(得分:1)

嗯,这里真正的问题是你在主UI线程上执行TCP / IP连接,这是一个糟糕的主意,因为你可能会阻止触摸事件和生成布局。这些天大多数新设备都会抛出NetworkOnMainThreadException来防止这种行为。

我要做的是将TCP / IP连接包装在Thread中,然后使用{Thread在工作人员(非UI,不可见)Fragment中执行setRetainInstance(true) 1}}。这可以保护Thread配置更改,因为即使Fragment被销毁,Activity仍将保留在内存中。您可以详细了解此方法here

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