Android,仅在为 Activity 呈现 UI 后才运行代码

标签 android

我知道这个问题在这里出现过很多次,但适用于所有这些情况的答案并不适用于我。当 Activity 开始时,我正在截取屏幕截图。我在 onCreate 的底部执行我的代码。它在 5 次中有 4 次效果很好,第 5 次屏幕还没有渲染,你得到一个黑色的屏幕截图。

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

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

最佳答案

您可以使用 Window.getDecorView() 获取顶部装饰 View 然后使用 post(Runnable)在上面。使用装饰 View 会生成可在任何应用程序中运行的可重用代码,因为它不依赖于某些特定的 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
        }

    });

关于Android,仅在为 Activity 呈现 UI 后才运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27080799/

相关文章:

android - 在 TextView 中显示日语而不是中文

java - 解析,带来所有结果

android - 从 Gradle 构建中排除临时 Realm 文件

android - 在android中滑动 ListView

android - 为什么我的 9 补丁 Android 初始屏幕中间有一个黑色矩形?

android - Lollipop 设备上的矢量可绘制渲染问题 (API22)

android - 如何在整个项目中使用相同的库?

未调用 PreExecute 方法上的 Android Asynctask

android - OKHttp HEAD 请求 - 速度优化

android - ImageButton 中的背景颜色