Android 检测应用程序何时完全绘制并可见

Android 检测应用程序何时完全绘制并可见,android,android-layout,Android,Android Layout,简言之,我需要知道应用程序的启动何时完成,即应用程序何时完全绘制并对用户可见 ViewTreeObserver.OnGlobalLayoutListener有一个方法-onGlobalLayout。 我看到它被多次调用,但我无法检测到每次特定调用背后的原因。通常在应用程序可见之前调用2-3次。因此,我需要知道在每次启动应用程序期间,它是否会被调用2次、3次或X次,因此我假设每次调用onGlobalLayout的原因可以帮助确定这一点 但如果有更好的方法来完成这项任务,我不会坚持使用onGloba

简言之,我需要知道应用程序的启动何时完成,即应用程序何时完全绘制并对用户可见

ViewTreeObserver.OnGlobalLayoutListener有一个方法-onGlobalLayout。 我看到它被多次调用,但我无法检测到每次特定调用背后的原因。通常在应用程序可见之前调用2-3次。因此,我需要知道在每次启动应用程序期间,它是否会被调用2次、3次或X次,因此我假设每次调用onGlobalLayout的原因可以帮助确定这一点


但如果有更好的方法来完成这项任务,我不会坚持使用onGlobalLayout,所以请随时提供其他可能性。

是的,有更好的方法。你离它很近

view.getViewTreeObserver().addOnPreDrawListener(myListener);
一旦对整个UI进行了测量和调整,就会调用此回调。此回调后,绘图操作将立即进行

有关用法的特别说明:

必须从侦听器onPreDraw方法返回true,否则绘图操作不会发生。 如果只需要调用一次,请不要忘记从onPreDraw方法中删除侦听器。view.getViewTreeObserver.removeOnPreDrawListenermyListener;否则,每次绘图操作都会一次又一次地给您打电话。
是的,有更好的办法。你离它很近

view.getViewTreeObserver().addOnPreDrawListener(myListener);
一旦对整个UI进行了测量和调整,就会调用此回调。此回调后,绘图操作将立即进行

有关用法的特别说明:

必须从侦听器onPreDraw方法返回true,否则绘图操作不会发生。 如果只需要调用一次,请不要忘记从onPreDraw方法中删除侦听器。view.getViewTreeObserver.removeOnPreDrawListenermyListener;否则,每次绘图操作都会一次又一次地给您打电话。
我想你走错方向了

您应该尝试。后运行操作

假设linearLayout1最终应该绘制,那么您应该试试这个

linearLayout1.post(new Runnable() {

    @Override
    public void run() {// will be call when linearLayout1 will be completely loaded
        // TODO Auto-generated method stub
        //you can write your code here
    }
});

我想你走错方向了

您应该尝试。后运行操作

假设linearLayout1最终应该绘制,那么您应该试试这个

linearLayout1.post(new Runnable() {

    @Override
    public void run() {// will be call when linearLayout1 will be completely loaded
        // TODO Auto-generated method stub
        //you can write your code here
    }
});

这个答案似乎有助于我的最终目标,但它并没有真正回答这个问题,因为我的问题也包括绘画。然而,对比我从onPreDraw和上次onGlobalLayout通话中得到的时间,我几乎确信在我的设备上绘图本身非常慢。。。除非几天后出现一个更好的答案,否则这将是被接受的答案,因为它也应该对大多数人有帮助,尽管它并不最适合我的具体情况。我可能没有抓住问题的重点,但正如我所说的,一旦这个回调返回,屏幕上的绘图就会出现。或者,在视图树观察者上有一个“onDrawListener”,它在绘制操作后立即被调用。这可能是你在寻找的答案DrawListener根本没有被调用,@Rumit-answer对我来说更好。尽管如此,我还是认为这个答案应该最适合我在Android嵌入式设备上运行的大多数应用程序,而且也很有用,描述也很清楚,但我只能投一次赞成票……这个答案似乎对我的最终目标很有帮助,但它并没有真正回答这个问题,因为我的问题也包括这幅画。然而,对比我从onPreDraw和上次onGlobalLayout通话中得到的时间,我几乎确信在我的设备上绘图本身非常慢。。。除非几天后出现一个更好的答案,否则这将是被接受的答案,因为它也应该对大多数人有帮助,尽管它并不最适合我的具体情况。我可能没有抓住问题的重点,但正如我所说的,一旦这个回调返回,屏幕上的绘图就会出现。或者,在视图树观察者上有一个“onDrawListener”,它在绘制操作后立即被调用。这可能是你在寻找的答案DrawListener根本没有被调用,@Rumit-answer对我来说更好。尽管如此,我认为这个答案应该最适合我的应用程序在Android嵌入式设备上运行的大多数其他应用程序,而且也很有用,描述也很清楚,但我只能投票一次……这应该有效,因为……它会将Runnable添加到此视图的消息队列末尾,以便在绘制视图后执行run方法?有没有办法找到最后将绘制哪个视图?@helleye我不知道,但我们应该很容易地假设最后应该绘制哪个布局…:-我们不应该吗?我不能轻易地假设最后会画出哪一个:无论如何,我没有看到通过选择不同的布局来发布一个runnable,所以这个解决方案最适合我的需要。这应该是可行的,
因为…它会将Runnable添加到此视图的消息队列末尾,以便在绘制视图后执行run方法?有没有办法找到最后将绘制哪个视图?@helleye我不知道,但我们应该很容易地假设最后应该绘制哪个布局…:-我们不应该吗?我不能轻易地假设最后会画出哪一个:无论如何,我没有看到通过选择不同的布局来发布一个runnable,所以这个解决方案最适合我的需要。