【问题标题】:How do I suspend layout drawing?如何暂停布局绘图?
【发布时间】:2018-06-20 11:27:29
【问题描述】:

.NET 下可以调用 SuspendLayout() / ResumeLayout()。

Android下有没有等价物?

我的原因是……我有一个包含多达 64 个“面板”的 RelativeLayout(另一个具有 3 个 TextView 子项的 RelativeLayout)。

通过串行通信链接,我收到一条 XML 消息,描述了要显示的面板数量、它们的大小以及在每个可见面板的 3 个文本视图中放置什么。

初始代码一切正常,我可以显示面板页面。

但是,当我收到新的 XML 消息时,我会隐藏所有面板,重新定位新 XML 消息中定义的面板,更新每个面板的 3 个文本视图,然后显示正在使用的面板。

同样,这有效,但是当所有面板都被隐藏时页面变为空白(可能 1-2 秒),然后出现所有新面板。

我猜测隐藏/显示面板是一个相对较快的过程,但在重新启用面板之前,解码 XML 和更新面板文本/字体/颜色/等需要一段时间来计算。

我想知道如何在更新顶级 RelativeLayout 时“暂停”绘制过程,然后在所有视图都已初始化后“恢复”绘制。

有没有办法做到这一点?

还是我从错误的角度来看待这件事? 如果是这样,最好的尝试方法是什么?

--- 更新 ---

好吧,我似乎有点为时过早,因为我在我的代码中发现了一个“怪癖”,导致了 1-2 秒的延迟(一条未处理的 XML 消息)。

但感谢您花时间给我一些指示。无聊的时候来点轻松的阅读!!

【问题讨论】:

    标签: android layout resume suspend


    【解决方案1】:

    您应该做的第一件事是弄清楚您可以将多少工作委托给后台线程(例如,“解码 XML”)。然后,您可以使用 Looper.getMainLooper() 安全地更新 UI。

    膨胀和填充新布局,然后交换它们,而不是更新可见的布局,这可能会更好。然后,您可以回收一组视图,即保持两倍于您展示的视图。这正是RecyclerView 的重点(另见"Creating a List with RecyclerView")。

    Live data 也可能值得您研究一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 2016-10-08
      • 2020-03-25
      • 2017-11-16
      相关资源
      最近更新 更多