我有一个中等复杂的 Android 应用程序,我通过 onConfigurationChanged 自己处理轮换,而不是重新启动活动。使用设备或模拟器一段时间(多次旋转)后,我开始看到应用程序间歇性地布局不正确(在横向模式下它保持纵向宽度)
我向活动中的所有“onAction”事件添加了跟踪日志记录语句,我看到了两个不同的流程:
正确的:
- onConfigurationChanged
- onMeasure (旧宽度)
- 布局
- onMeasure (使用新宽度)
- onSizeChanged
- 布局
- 绘制
当布局不正确时,我看到了这个流程
不正确:
- onMeasure (使用新宽度)
- onSizeChanged
- 布局
- 绘制
- onConfigurationChanged
- onMeasure (使用新宽度)
- 布局
- 绘制
查看发送的消息,我想我看到了问题的一部分:我看到 3 条重要消息被发布:
- MessageType 1003 --> mWinFrame 的新大小
- MessageType 1000 --> New Measure/Layout pass(使用 mWinFrame 的大小)
- MessageType 118 --> 配置更改,启动 onConfigurationChanged。
当布局正确时,顺序似乎是 118、1003、1000。当布局错误时,顺序似乎是 1003、1000、118,因此在 onConfigurationChanged 发生之前使用新宽度进行测量。
对于额外的混淆,当布局不正确时,当我附加层次结构查看器并转储层次结构时,它会立即变得正确,但无论我在 onPreDraw 中请求重新布局和/或无效多少次,它都不会变得正确。
问题:
1) 即使给出了无序调用,我最终还是得到了 onConfigurationChanged 并请求重新布局,这发生在新的宽度和高度上,为什么这不会导致屏幕上的更新?
2) 为什么这些消息的发布顺序会随着时间而改变?我从来没有在新启动时看到过这个,但是当手机/模拟器已经“运行了一段时间”时开始看到它。