Android,在Activity的UI渲染完成后才运行代码

13

我知道这个问题在这里已经被提出了很多次,但是那些解决方案并不适用于我的情况。当活动开始时,我会对屏幕进行截图。我将我的代码放在onCreate的底部执行。它在5次中有4次非常好用,但是第5次屏幕尚未渲染,导致截图变成黑色。

我的解决方法是在onCreate结尾处启动一个AsyncTask来执行截屏代码。如果我加上200ms的延迟,那么它能成功9次中的10次。500ms的延迟可以让它100%成功,但你会注意到延迟。这似乎也是一个糟糕的解决方案,因为这500ms是一个任意的数字,在所有设备上都可能无法正常工作。

如何知道UI何时呈现,以便我可以进行截图呢?


1
调用 View.post() 并在 run() 方法中完成你的工作 - pskink
1个回答

22

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

    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接