Fragment回调后UI显示异常问题记录
-
情况:根据回调的数据或状态变化 UI,UI 未变化或变化异常。
- 原因:在回调时,该 Fragment 处于隐藏状态,show() 后数据或 UI 状态未改变或显示异常。
- 解决方法:回调前将数据状态等保存好,重写 onHiddenChanged() 方法,在其中进行相关 UI 数据变化逻辑。
-
情况:Fragment UI 或数据不变化,出现空指针
- 原因:Fragment 中使用 getActivity() 获取了上下文,该方法时常会获取为空
- 解决:在 Fragment 创建时,自身保存 Activity 引用,之后使用它。
-
情况:原本应该显示成功的 Fragment UI 在闪了一下成功之后就没了。
- 原因:多个线程或进程都有 handler,多个 handler 对同一 UI 进行了 post 修改。具体情况:用户点击,调用系统功能并通过 EventBus 消息改变UI,有 ActivityThread 主线程的 handler,一个子线程的 handler。在系统回调时主线程根据回调准备 post,此时 EventBus 事件逻辑还在执行,子线程完成了系统功能并通过回调进行了 post UI,这时候主线程才完成逻辑,并通过 Activity 注册的 EventBus 进行 post UI 变化,导致 UI 先显示已完成,然后一直显示进行中。
- 解决: 添加完成状态,在改变 UI 时判断再决定变不变。
-
情况:Fragment UI 在数据同步成功执行回调时,只显示了一半的数据,并且显示数据获取失败。
- 原因1:拥有错误断开后自动重连字段。三处需要获取数据,两处成功,一处失败,成功的回调将失败的状态更新了,但失败处的 UI 控制职责为它自己,因此提示失败,其余两处正常成功。
- 原因2:有两个地方都注册了同一数据获取的回调,一处成功,另一处失败,失败刷新了获取状态并更新了已获取的数据。导致数据已经获取成功的情况下,依旧提示错误。
- 解决:添加各自单独的重连状态,对失败单独异步处理。(全部一起重连太耗资源了)。获取数据时删除之前的数据,当其中有一个获取成功,其余共享该数据,修改使用副本,原数据不允许修改。