我正在尝试开发一个简单的聊天应用程序,仅用于学习目的。 我的问题是,当屏幕方向改变时,TCP / IP连接被关闭并在方向改变后重新创建。
我知道Android会破坏活动并在更改方向时重新创建它。
所以我的问题是:只改变视图但其他所有内容保持不变是可行的吗?
由于
答案 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
代替。