android – 处理屏幕方向的最佳方式使用动态创建的视图时更改?
作者:互联网
当我开始我的应用程序的某个活动时,用户“欢迎”一个对话框,他必须填写一些数据才能继续.然后,在活动本身,用户有2个按钮,使他能够动态创建和删除无限数量的字段(由几个视图组成)
如您所知,当屏幕方向发生变化时,活动将重新启动,因此每个信息都会丢失.显然,这可能会有问题.
为了处理屏幕方向,android文档建议开发人员使用onRetainNonConfigurationInstance().唯一的问题是,如果你使用它来保存上下文中的对象,所有绑定的视图都会泄漏.在我的情况下,这是进一步的问题,因为该活动中的数据固有地与其视图相关联,而视图又与其上下文相关联.
Android文档不建议开发人员自己处理配置更改.他们说(并且我引用)“总的来说,一个短期的解决方案,只会使他们的生活复杂化”
我可以轻松绕过初始对话框,创建一个hasBeenShown布尔值并将其设置为true.我甚至可以通过保存元数据来绕过“动态创建的视图”问题:在这种情况下,生成的字段数量,类型,彼此的相对位置,文本或选择等等…(有一些小的错误,但没有什么严重的).
但由于字段(视图)是使用layoutInflate动态生成的(因此我们可以拥有无限数量的视图),因此在屏幕方向更改后重新生成这些相同的字段时,即使在模拟器上,应用程序也会变得非常慢.在真实设备(三星Galaxy S)上有20个视野(大约120个视图),花了将近1分钟才完成.
奇怪的是,当我直接传递视图(因此泄漏所有这些东西)时,我的Samsumg Galaxy S花了不到10秒就完成了.
有了这些信息,您认为最好的方法是什么?
(1) – 让字段重置? (不是一个真正的选择,我打赌如果他们无意中倾斜他们的屏幕= P,任何人都会生气
(2) – 添加一个加载屏幕,而android负责改变屏幕方向?
(3) – 阻止屏幕方向改变
(4) – 处理屏幕方向改变自己,并希望阻止Doom Android文档谈论永远不会来.
P.S:有点offtopic,但当我的活动结束时,所有内存都被释放了吗?
解决方法:
您的情况与我的不同,但类似的解决方案可能是有序的.
同样,因为Android会在方向更改时销毁并重新创建,所以我最初遇到了执行网络通信的异步任务的问题.显然,当第一个方向更改仍在执行时,我不应该为每个方向更改创建新请求.
为了节省一些网络使用和头痛,我只是自己“处理”方向更改.将此代码放在AndroidManifest.xml中
<activity android:name=".whatever" android:configChanges="keyboardHidden|orientation"/>
你允许Android保持当前的上下文,视图和变量等.会发生什么是布局会自己调整大小,但如果你设计正确,那么你应该没问题.
AFAIK我唯一阻止Android做的就是使用基于设备方向的专门布局(我不需要),到目前为止,我还没有被预先警告的即将到来的厄运击中.
标签:android,screen-orientation,memory-leaks 来源: https://codeday.me/bug/20190827/1738362.html