Подтвердить что ты не робот

Отсутствие или неправильные изображения и фоны случайным образом на протяжении всего жизненного цикла приложения

Я надеялся, что кто-то может иметь представление о том, что вызывает такое поведение:

В моем приложении, в кажущихся случайными местами и в случайных условиях, я наблюдаю этот странный вопрос пользовательского интерфейса. Изображения иногда загружаются черными (с правильными границами) или с неправильным источником изображения (опять же, с правильными границами). Это эффекты ImageViews и произвело теги android:background со ссылками на цветовые ресурсы.

Мое приложение опирается на 6 проектов библиотеки, оно запускает собственный код через службу и действия в приложении, используя GlSurfaceViews (хотя не все действия, отображающие проблему, содержат компоненты OpenGL). Проблема в том, что я могу предположить, что из любого из этих мест или их комбинации можно использовать большие объемы памяти.

Вы можете увидеть это поведение в следующих снимках экрана:

  • На самом деле это изображение ширины столбца шириной примерно 6 пикселей, которое было неправильно вписано в мой ImageView (изображение, похоже, правильно оценило себя).

    Torn

  • При выходе из приложения, а затем снова (снова), он появился (и остался) следующим образом:

    Black

  • После принудительной очистки и очистки данных приложения он возвращается в правильный формат:

    This is the original:

Как вы также можете увидеть изображение увеличительного стекла рядом с ним, отображается в каждом из них. Проблемы с этими недостающими/неправильными изображениями и фонами кажутся случайными, на протяжении всего жизненного цикла приложения, и я не смог найти способ воспроизвести его.

Макеты для этих изображений не являются чем-то особенным, я не делаю ничего смешного в течение жизненного цикла рендеринга (я не переопределяю onDraw() или onMeasure() или тому подобное). Источник этих изображений не устанавливается динамически, а через XML.

Как видно из приведенного выше примера, это не проблема сборки, поскольку это происходит между жизненными циклами приложения, а не между установками. Это также происходит на разных устройствах, Samsung 8.9, Acer Iconia Tab, Motarola XOOM,

Мне кажется, что это какая-то ошибка в справочной таблице, может быть, она была подтолкнута моим родным кодом? Или это влияет на меня на некоторых этапах приложения, используя слишком много памяти?

Здесь источник XML для приведенного выше примера:

<LinearLayout   xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/browseProgressWrapper"
                android:layout_width="match_parent"
                android:layout_height="@dimen/actionbar_compat_height"
                android:orientation="horizontal">
    <RelativeLayout android:layout_width="@dimen/search_bar_width"
                    android:layout_height="match_parent">       
        <EditText       android:id="@+id/browseFilter"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_marginTop="4dp"
                        android:layout_marginLeft="5dp"         
                        android:imeOptions="actionSearch"
                        android:background="@drawable/edit_text_blue"
                        android:maxLength="30"/>
        <ImageView      android:id="@+id/clearSearch"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_alignParentRight="true"
                        android:layout_centerVertical="true"
                        android:src="@drawable/ic_input_delete"
                        android:layout_marginRight="5dp"/>
    </RelativeLayout>                   
    <ImageView      android:id="@+id/browseFilterButton"
                    android:src="@drawable/ic_menu_search"
                    android:scaleType="center"
                    android:layout_width="@dimen/actionbar_compat_height"
                    android:layout_height="@dimen/actionbar_compat_height"
                    android:layout_gravity="center_vertical"
                    android:minWidth="@dimen/actionbar_compat_height"/>         
</LinearLayout>

Более полное описание кода/макета, окружающего другое подобное событие, я получил снимок экрана для:

У меня есть "Настройки" Activity, который перезагружает мое приложение после сохранения новых настроек. Он делает это, останавливая Service, вызывая новый Activity (активность Splash) и завершая себя:

   mConfiguration.save();
   mConfiguration = new Configuration(Configuration.getInstance());
   getActivity().stopService(new Intent(getActivity(), NativeService.class));
   getActivity().finish();
   startActivity(new Intent(getActivity(), SplashActivity.class));

В большинстве случаев (и на большинстве устройств) это прекрасно работает, активность Splash содержит изображение, которое загружается правильно. Иногда, хотя на некоторых устройствах активность Splash загружает либо неправильный ресурс (что мои тестеры называют "перевернутым Nike tick" ), либо просто пустым полем (как видно ниже). Кто-нибудь знает, почему?

enter image description here

Вот макет страницы Splash, так как вы можете видеть ее довольно простой, без сюрпризов:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/ContentBackgroundColor"
    android:orientation="vertical" >

    <View
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="2" />

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:src="@drawable/manager_android_400" />

    <View
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <ProgressBar
        style="@android:style/Widget.ProgressBar.Large"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" />

    <View
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="2" />

</LinearLayout>

Теория проверена и развенчана:

Я предположил, что это может быть проблема с процессором/памятью, когда макет полностью не вытягивается до того, как экран Splash выходит и переходит к следующему действию, поэтому я вставляю этот фрагмент кода:

    image = (ImageView) findViewById(R.id.image);
    image.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {
            image.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            moveToStartScreen.start();
        }
    });

Надеюсь, что вышеприведенный код удостоверится, что изображение определенно загружено, прежде чем перейти на стартовую страницу, но, похоже, не имеет наблюдаемого эффекта.

Другая теория

Мне также было интересно, может ли это быть вызвано ресурсами R.id/R.colour/R.drawable каким-то образом, как быть в курсе выполнения программы? Кто-нибудь знает, почему это может случиться.

Может ли мой собственный код работать на некоторых адресах памяти, которые Android неправильно распределяет?

Кто-нибудь заметил это раньше - или, может быть, знает, почему это происходит?

4b9b3361

Ответ 1

Грэм, у меня была почти такая же проблема, и выяснилось, что это была анонсированная ошибка андроида plattform. Это было исправлено в версии 3.0, я думаю. С каким API вы компилируете? Попробуйте построить с последним доступным api и обязательно скомпилируйте JDK 1.6

Если ваша проблема связана с этой ошибкой, это должно устранить проблему.

Ответ 2

Это простая проблема обновления, очистки и перестройки. Изображения в ваших различных идентификаторах папок или индексов идентификатора ресурса находятся вне последовательности, поскольку они либо были изменены вне среды Eclipse IDE (через внешний источник управления, такой как GIT, SVN или другие изменения) и не обновлены в навигаторе eclipse. Или файлы могут быть обновлены в проекте библиотеки, от которого зависит ваш пользовательский интерфейс.

Я обнаружил, что хотя .java-зависимые файлы распространяются по всей системе, это не всегда касается таких ресурсов, как изображения и XML файлы.

Решение довольно просто, очистите все, обновите все ваши проекты и перестройте. Потянутые или черные края должны исчезнуть.

Примечание. Преобладающее проявление этой проблемы возникает, когда 9-патч-образы обрабатываются как стандартные .png-изображения. Это означает, что они растягиваются линейным образом по изображению, а не только по краям. Для меня это объясняет ваш пример "Torn/Stretched". Я часто видел подобное. Другим распространенным проявлением является то, что текстовые строки иногда отображаются с неправильными ресурсами!