我有一个相当复杂的android应用程序,我自己通过onconfigurationchanged来处理轮换,而不是重新启动活动。使用设备或仿真器一段时间(多次旋转)后,我开始看到应用程序间歇性地错误布局(在横向模式下,它保持其纵向宽度)
我向活动中的所有“onAction”事件添加了跟踪日志记录语句,并看到两个不同的流:
对的:
配置已更改
测量(旧宽度)
在布局上
测量(新宽度)
OnSizeChanged公司
在布局上
OnDRAW
当布局不正确时,我看到这个流程
不正确的:
测量(新宽度)
OnSizeChanged公司
在布局上
OnDRAW
配置已更改
测量(新宽度)
在布局上
OnDRAW
查看发送的邮件,我想我看到了问题的一部分:我看到了3条重要的邮件:
消息类型1003-->mwinframe的新大小
messagetype 1000-->新建度量/布局过程(使用mwinframe的大小)
messagetype 118-->配置更改,启动onconfigurationchanged。
当布局正确时,顺序似乎是11810031000。当它是错误的顺序似乎是1003100118,所以在onconfigurationchanged发生之前用新的宽度进行测量。
对于额外的额外混淆,当布局不正确时,当我附加层次结构查看器并转储层次结构时,它会立即变为正确,但无论我在onpredraw中请求了多少次relayout和/或invalidate,它都不会变为正确。
问题:
1)即使是在无序调用的情况下,我确实最终更改了onconfiguration并请求重新部署,这将与新的宽度和高度一起发生,为什么这不会导致屏幕上的更新?
2)为什么这些信息的发布顺序会随着时间而改变?我从来没有在新启动时看到过这个,但是当手机/模拟器已经“运行了一段时间”时,我就开始看到它了。
最佳答案
这似乎更经常发生在速度较慢的手机上,一种规避它的方法是执行一个可怕的错误…onpause()中的setvisible(false)和post runnable来执行setvisible(true)onresume()。
这就给了在测量/布局之前注册正确高度的时间,你的层次查看器提示有一个神奇的方法,可能不是这个方法,但至少现在看来它是管道胶带的问题。