片段的“旧”版本(包含旧数据)在显示屏上“卡住”:简单文本(日志记录确认正在更改)在onResume中设置的TextView中不会更改。片段(应该替换该片段)可以正常工作(但不可见)-屏幕可见,但屏幕不透明,但触摸起来是“透明的”-日志显示片段已正确交换。
在真实硬件和Oreo上的仿真器上进行了测试,仅在Pie上进行了仿真。
(抱歉:我什至不确定要问什么具体问题或相关代码,请建议可能有帮助。请记住上面有关仅P且仅在睡眠后的限制。)>
详细信息:此应用程序将接管整个屏幕,这对于目标受众(不是您的典型电话用户)是正确的。专门的音频播放器。在API 17-28上运行(使用“古老的”硬件作为特定目标)。
这里的所有内容都包含在一个Activity中,涉及两个片段。一个是一个非常简单的片段,只有几个按钮(表示正在播放音频),另一个是带有相当简单视图的ViewPager。我相信这两个片段都存在问题,无论它是什么,但是我们将专注于简单的“播放”片段。
App在ViewPager片段中启动,该片段具有将其带到“正在播放”片段(将启动音频)的按钮。该片段实质上是一个全屏的STOP按钮,其中显示了一些其他信息,以及此处未使用的其他几个按钮。击中停止点会返回到视图分页器,并且在大多数情况下都能正常工作。
但是,在Android Pie模拟器上运行时,如果允许屏幕在“播放”状态下超时,然后使用模拟器工具栏上的后退或电源按钮重新启动,则片段的“停止”按钮会起作用(调用按钮处理程序),片段会更改(根据日志打印输出),但屏幕上的实际显示不会更改。 (有时,这需要两次睡眠,才可以进行两次以上的睡眠。)然后,将激活ViewPager屏幕的按钮,如果我单击它们,则记录显示它们正在被调用。如果我按下了(不可见的)开始按钮,则片段(根据日志)会再次更改,并且音频会重新启动。这可以永远持续下去。 (系统状态栏中的“音频播放”图标会在应有的状态下出现。)单击“概述”按钮,然后在应用程序上单击,将正确的屏幕刷新到适当的屏幕。旋转(但只有在单击新的“旋转我”按钮之后才可以解决)。
我在“正在播放”的片段中放置了一个静态int计数器,并且我看到它被onCreateView按预期方式增加了(在日志中可以看到)。它也显示在屏幕上的TextView中的onResume中,并且在遇到错误时不会改变。日志确认已调用onResume。屏幕上有闪烁的文本,但发生这种情况时不会闪烁(直到使用“概述”或旋转进行完全刷新为止)。
我还在记录“正在播放”片段的对象位置,并且它没有变化。日志消息确认该类的内存没有被回收。 (我使用非静态计数器也对onCreateView调用进行计数,而不是像完全重新创建类时那样将其重置为零。)日志会确认从onCreateView到onDestroyView的完整生命周期正在发生,而显示仍保持不变保持不变。
我正在使用androidx / SupportFragmentManager。
我尝试了很多“随机”的事情:
有时候它们会稍微改变一些东西,但是没有一个能解决潜在的问题。谁能提出更好的问题/实验?考虑到所涉及的(复杂的)代码量,将代码暂存到此处只会使情况变得更糟。如果您想查看整个内容,请参见github。 (https://github.com/DonnKey/homerplayer。)只要有线索,我就可以在上一个版本的bug重新出现。
再次,对于这个模糊的问题,我们感到抱歉,但是我什至在攻击该问题的方法上也陷入困境。