Неправильное время рисования в средстве просмотра иерархии? - PullRequest
5 голосов
/ 29 июня 2011

Я провожу некоторые тесты с помощью инструмента просмотра иерархии, который поставляется с 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. Кто-нибудь знает разницу?

1 Ответ

0 голосов
/ 16 марта 2018

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

Я проверил это в 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);
    }
  }

enter image description here

enter image description here

...