【问题标题】:Android, run code only after the UI has been rendered for an activityAndroid,仅在为活动呈现 UI 后运行代码
【发布时间】:2019-09-20 00:54:40
【问题描述】:

我知道这个问题在这里出现了很多次,但适用于所有这些情况的答案对我来说并不适用。当活动开始时,我正在截取屏幕截图。我在 onCreate 的底部执行我的代码。它在 5 次中的 4 次中运行良好,而第 5 次屏幕尚未渲染,您会得到黑色屏幕截图。

我的解决方法是在 onCreate 结束时启动的 AsyncTask 中执行屏幕截图代码。如果我睡眠 200 毫秒,它会工作 10 次中的 9 次。 500 毫秒的睡眠可以 100% 获得它,但您会注意到延迟。这似乎也是一个糟糕的解决方案,因为 500 毫秒是一个任意数字,可能不适用于所有设备。

如何知道 UI 何时呈现,以便截取屏幕截图?

【问题讨论】:

  • 调用 View.post() 并在 run() 方法中完成你的工作

标签: android


【解决方案1】:

您可以使用Window.getDecorView() 获取顶部装饰视图,然后在其上使用post(Runnable)。使用装饰视图会产生可在任何应用程序中运行的可重用代码,因为它不依赖某些特定的 View 元素作为膨胀布局的一部分。

调用将导致您的Runnable 被放入消息队列中以在 UI 线程上运行,因此不要在 Runnable 中运行长时间操作,以免阻塞 UI 线程。


简单实现 - Kotlin

// @Override protected void onCreate(Bundle savedInstanceState) {

    window.decorView.post {
        // TODO your magic code to be run
    }


简单实现 - Java

// @Override protected void onCreate(Bundle savedInstanceState) {

    getWindow().getDecorView().post(new Runnable() {

        @Override
        public void run() {
            // TODO your magic code to be run
        }

    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-27
    • 2016-07-31
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多