我正在尝试开发一个简单的聊天应用程序,仅用于学习目的。我的问题是,当屏幕方向改变时,TCP/IP 连接会在方向改变后关闭并重新创建。
我知道Android会在更改方向时破坏活动并重新创建它。
所以我的问题是:是否可以只改变视图而其他一切都保持不变?
谢谢
您应该将 TCP/IP 通信实现为服务,然后它将不依赖于任何方向更改/其他活动的重新创建。
您想阅读处理运行时更改文档中称为自己处理配置更改的部分。简而言之,您告诉它您将通过在 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();
}
}
您可以将连接设为静态而不在它为 != null 时重新创建它,或者更好地将其包装到使用单例模式的单独类中
只是不要从活动中创建连接。您可以改用应用程序:
在您的清单中:
<application
android:name=".MyApplication" ...>
它将被创建一次,并贯穿应用程序的整个生命周期,即使活动被销毁。
另一种选择是服务。对于聊天应用程序,我会使用它,因为它将后台网络工作与 UI 完全分开。
好吧,这里真正的问题是您在主 UI 线程上执行 TCP/IP 连接,这是一个糟糕的主意,因为您冒着阻止触摸事件和布局生成的风险。如今,在大多数新设备上都抛出了ANetworkOnMainThreadException
以防止这种行为。
我要做的是将 TCP/IP 连接包装在 aThread
中,然后Thread
在Fragment
带有setRetainInstance(true)
. 这可以保护您Thread
的配置更改,因为Fragment
即使Activity
被销毁,它也会保留在内存中。您可以在此处阅读有关此方法的更多信息。
如果 TCP/IP 连接需要跨多个Activity
实例存在,则应使用 aService
代替。