Неверное время прорисовки в средстве просмотра иерархии?

Я провожу несколько тестов с помощью средства просмотра иерархии, которое входит в состав Android SDK.

Activity, который я тестирую, имеет следующий xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <TextView
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/hello"
        android:layout_alignParentTop="true"/>

    <TextView android:id="@+id/slow_measure"
        android:layout_width="fill_parent"
        android:layout_height="30dp"
        android:text="Slow Measure"
        android:layout_alignParentBottom="true"/>

    <TextView android:id="@+id/slow_layout"
        android:layout_width="fill_parent"
        android:layout_height="30dp"
        android:text="Slow Layout"
        android:layout_above="@id/slow_measure"/>

    <com.test.SlowDrawView android:id="@+id/slow_draw"
        android:layout_width="fill_parent"
        android:layout_height="30dp"
        android:background="#FF0000"
        android:text="Slow Draw"
        android:layout_above="@id/slow_layout"/>
</RelativeLayout>

SlowDrawView расширяет TextView, но я изменил onDraw() следующим образом:

@Override
protected void onDraw(Canvas canvas) {
    try {
        Thread.sleep(3000L);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    super.onDraw(canvas);
}

Когда я проверяю время прорисовки этого View в hv, я замечаю, что оно меньше 3 секунд, что не имеет никакого смысла.

Есть идеи, почему это происходит? Я также заметил, что в андроиде git repo есть две версии hv. Кто-нибудь знает разницу?


person Macarse    schedule 28.06.2011    source источник


Ответы (1)


Похоже, что средство просмотра иерархии использует в своих измерениях «время потока» вместо «время настенных часов». Это означает, что он не учитывает все время, когда поток ожидает некоторых результатов от другого потока (блокируя его) или время ожидания потока, как в вашем примере.

Я проверил это в Android CPU Monitor, и это подтверждает мою идею.

Вы можете загрузить основной поток какой-либо тяжелой операцией, чтобы увидеть, как увеличивается время потока. Я сделал это, вызвав рекурсивный алгоритм Фибоначчи для числа 39 из onDraw() и onLayout():

 @Override
protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  fib(39);
}

public static int fib(int n) {
    if (n == 0 || n == 1) {
      return 1;
    } else {
      return fib(n - 1) + fib(n - 2);
    }
  }

введите здесь описание изображения

введите здесь описание изображения

person Gaket    schedule 16.03.2018