3

当启动我的应用程序的某个活动时,用户会受到一个对话框的“欢迎”,他必须填写一些数据才能继续。然后,在活动本身中,用户有 2 个按钮,使他能够动态创建和删除无限数量的字段(由多个视图组成)

如您所知,当屏幕方向发生变化时,活动会重新启动,因此所有信息都会丢失。显然,这可能是有问题的。

为了处理屏幕方向,android 文档建议开发人员使用onRetainNonConfigurationInstance()。唯一的问题是,如果您使用它在上下文中保存对象,所有绑定的视图都会泄漏。在我的情况下,这更成问题,因为该活动中的数据本质上与其视图相关联,而视图又与其上下文相关联。

Android 文档不建议开发者自己处理配置更改。他们说(我引用)“一般来说,一个短期的解决方案只会让他们以后的生活复杂化”

例如,我可以轻松绕过初始对话框,创建一个 hasBeenShown 布尔值并将其设置为 true。我什至可以通过保存元数据来绕过“动态创建的视图”问题:在这种情况下,生成的字段数量、它们的类型、它们彼此的相对位置、它们的文本或选择等等......(还有一些次要的错误,但没有什么严重的)。

但是由于字段(视图)是使用 layoutInflate 动态生成的(因此我们可以拥有无​​限数量的视图),因此在屏幕方向更改后重新生成相同的字段时,即使在模拟器上,应用程序也会变得非常慢。在真实设备 (Samsung Galaxy S) 上有 20 个字段(约 120 个视图),需要将近 1 分钟才能完成。

奇怪的是,当我直接通过视图(因此泄露了所有这些东西)时,我的 Samsumg Galaxy S 不到 10 秒就完成了。

有了这些信息,您认为最好的方法是什么?

(1) - 让字段重置?(这不是一个真正的选择,我敢打赌,如果他们无意中倾斜屏幕 =P,任何人都会生气)

(2) - 在 android 负责更改屏幕方向时添加加载屏幕?

(3) - 阻止屏幕方向更改

(4) - 自己处理屏幕方向的改变,希望 Doom Android 文档中提到的阻碍永远不会到来。

PS:有点跑题了,但是当我的活动结束时,所有的内存都被释放了对吧?

4

1 回答 1

6

您的情况与我的不同,但可能需要类似的解决方案。

同样,由于 Android 将在方向更改时销毁并重新创建,所以我最初在执行网络通信的异步任务方面遇到了问题。显然,当第一个仍在执行时,我不应该在每次方向更改时创建新请求。

为了节省一些网络使用和头痛,我只是自己“处理”方向变化。通过将此代码放入您的 AndroidManifest.xml

<activity android:name=".whatever" android:configChanges="keyboardHidden|orientation"/>

您允许 Android 使用视图和变量等保留当前上下文。发生的情况是布局会自行调整大小,但如果您设计正确,那么您应该没问题。

AFAIK 我阻止 Android 做的唯一一件事是使用基于设备方向的专门布局(我不需要),到目前为止,我还没有受到预先警告的即将到来的厄运的打击。

于 2010-11-30T04:19:54.700 回答