Android,仅在为活动呈现UI之后运行代码

时间:2014-11-22 18:14:54

标签: android

我知道这个问题在这里很多次,但是在所有这些情况下都适用的答案对我来说不起作用。当活动开始时,我正在截取屏幕截图。我在onCreate的底部执行我的代码。它的效果非常好4次5次,第5次屏幕还没有渲染,你会得到一个黑色截图。

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

我怎么知道UI的呈现时间,所以我可以截取屏幕截图?

2 个答案:

答案 0 :(得分:8)

您可以使用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
        }

    });

答案 1 :(得分:0)

getWindow()可能返回null。

为实现相同目标的建议:

final Handler handlerUI = new Handler(Looper.getMainLooper());
Runnable r = new Runnable() {
    public void run() {
        // TODO your magic code to be run
    }
};
handlerUI.post(r);