ConstraintLayout Vs RelativeLayout & CardView - Кэш и пространство памяти
Я разработал приложение, которое извлекает данные из json в локальную базу данных на мобильных устройствах и отображает их из локальной базы данных с помощью RecyclerView
, а мой контейнер выглядит следующим образом:
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="end"
android:layout_gravity="end"
android:id="@+id/detailContainerLayout"
android:baselineAligned="true"
android:background="@drawable/border_bottom"
>
<TextView
android:id="@+id/article_title"
style="@style/TextAppearance.AppCompat.Subhead"
android:layout_width="220dp"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:paddingTop="2dp"
android:layout_marginRight="9dp"
android:layout_marginLeft="4dp"
android:textColor="@color/buttons_background"
android:fontFamily="sans-serif-condensed"
android:maxLines="2"
android:textSize="@dimen/text_main"
android:layout_gravity="end"
android:gravity="start"
android:layoutDirection="rtl"/>
<TextView
android:id="@+id/article_date"
style="@style/TextAppearance.AppCompat.Body1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="8dp"
android:paddingRight="9dp"
android:textColor="@color/textColor"
android:maxLines="1"
android:layout_gravity="end"
android:gravity="end"
android:textSize="@dimen/date_size"
android:layout_marginTop="8dp"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_gravity="center_horizontal|bottom"
android:gravity="center_horizontal|bottom"
android:layout_marginTop="10dp"
>
<TextView
android:id="@+id/article_place"
style="@style/TextAppearance.AppCompat.Body1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/textColor"
android:layout_gravity="start|bottom"
android:gravity="start|bottom"
android:layout_weight="1.1"
android:maxLines="1"
android:fontFamily="sans-serif"
android:paddingBottom="5dp"
android:layoutDirection="rtl"
android:layout_marginRight="3dp"
/>
<TextView
android:id="@+id/article_placeIcon"
style="@style/TextAppearance.AppCompat.Body1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/textColor"
android:maxLines="1"
android:layout_gravity="start|bottom"
android:gravity="start|bottom"
/>
<TextView
android:id="@+id/article_subtitle"
style="@style/TextAppearance.AppCompat.Body1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/textColor"
android:maxLines="1"
android:layout_gravity="start|bottom"
android:gravity="start|bottom"
android:layout_weight="1.4"
android:fontFamily="sans-serif"
android:layout_marginRight="3dp"
android:paddingBottom="5dp"
android:layoutDirection="rtl"
/>
<TextView
android:id="@+id/article_subtitleICON"
style="@style/TextAppearance.AppCompat.Body1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/textColor"
android:maxLines="1"
android:layout_gravity="start|bottom"
android:gravity="start|bottom"
android:fontFamily="sans-serif"
android:layout_marginRight="9dp"
android:paddingBottom="5dp"
android:layoutDirection="rtl"
/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="100dp"
android:layout_height="80dp"
android:gravity="start|bottom"
android:layout_gravity="start|bottom"
>
<elryad.harajsooq.ActionbarContent.AllAds.ui.DynamicHeightNetworkImageView
android:id="@+id/thumbnail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/photo_placeholder"
android:layout_gravity="start|bottom"
/>
</LinearLayout>
Поэтому, когда я использовал CardView
или RelativeLayout
в качестве контейнера для своих элементов, они очень сильно меняли мой кеш приложений и памяти, мой DATA составлял 20 МБ и My CACHE было 50 Мбайт +, но после того, как я изменил расположение контейнера на ConstraintLayout
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:clickable="true"
android:focusable="true"
android:background="@drawable/border_bottom">
<TextView
android:id="@+id/article_title"
style="@style/TextAppearance.AppCompat.Subhead"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="0dp"
android:layout_marginRight="5dp"
android:layout_marginTop="-10dp"
android:gravity="right"
android:fontFamily="sans-serif-condensed"
android:maxLines="1"
android:paddingLeft="5dp"
android:paddingTop="2dp"
android:textColor="@color/buttons_background"
android:textSize="@dimen/text_main"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toRightOf="@+id/thumbLayout"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<items ....
....>
</android.support.constraint.ConstraintLayout>
Данные и кеш вернулись к нормальному состоянию и небольшому размеру, как показано ниже:
![введите описание изображения здесь]()
Я не знаю, что произошло с CardView или RelativeLayout, что делает мои данные приложения и кеш большим пространством... может быть, кто-то может это объяснить. Спасибо заранее.
Ответы
Ответ 1
Маска Contraint имеет
Исправлено исправление ошибок слева направо (параметры макета были кэшированы, что предотвращало их изменение во время выполнения)
Улучшения производительности при первом макете
Поддержка Ratio была расширена для работы, когда для обоих размеров установлено значение MATCH_CONSTRAINT (0dp). Это касается случая, когда одно измерение ограничено, и вы хотите определить другое измерение как отношение.
Итак, у вас есть эти повышения производительности в макете Constraint, поэтому лучше использовать ее, а не относительную компоновку.
попробуйте найти здесь
Ответ 2
Сложная компоновка, вложенная вложенная LinearLayout
будет иметь больше Object
, созданных во время рендеринга. ConstraintLayout
- это плоский макет, чтобы уменьшить эти накладные расходы.
Ответ 3
Попробуйте очистить сохраненный массив и другие, которые вы используете в представлениях, также очистить переменную и все, что вы инициализировали. Потому что это может быть пространство для этого. Попытайтесь уйти в обратную сторону, или когда у вас нет использовать.