Знаете ли вы, как избежать утечек памяти?Android - Хорошая практика, чтобы избежать утечек памяти
В настоящее время я работаю над приложением, которое имеет небольшое количество утечек памяти, которые я изо всех сил исправляю, главным образом потому, что я не знаю привычек, которые мне нужно предпринять, чтобы их избежать.
Например, в данный момент я получаю этот вопрос
Fatal Exception: java.lang.OutOfMemoryError
Failed to allocate a 1627572 byte allocation with 1293760 free bytes and 1263KB until OOM
Raw Text
dalvik.system.VMRuntime.newNonMovableArray (VMRuntime.java)
android.view.LayoutInflater.inflate (LayoutInflater.java:429)
com.XX.Dialog.PopupDialog.onCreateView (PopupDialog.java:50)
Что происходит из inflater.inflate(R.layout.dialog_popup, container, false);
в onCreateView
!
Here is the DialogFragment concerned :
public final class PopupDialog extends DialogFragment {
public PopupDialog()
{
}
@Override
public void onSaveInstanceState(Bundle outState) {
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
View view = inflater.inflate(R.layout.dialog_popup, container, false);
return view;
}
Макет довольно длинный, но в основном он получил 5 изображений. Вот пример:
<ImageView
android:layout_width="match_parent"
android:layout_height="80dp"
android:id="@+id/popup_top_bg_iv"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="false"
android:layout_alignParentStart="false"
android:src="@drawable/popup_top_bg"
android:scaleType="fitXY"
android:background="@color/transparent" />
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/popup_top_bg_iv"
android:background="#ffffff"
android:layout_alignBottom="@+id/popup_bottom_ll" />
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:id="@+id/popup_top_iv"
android:src="@drawable/popup_0_top"
android:scaleType="fitCenter"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dp" />
....
Так .... Мне было интересно, если вы знаете:
1. Что может привести к этой ошибке утечки памяти из этот диалогFragment?
2. Любые хорошие практики в android, чтобы избежать утечек памяти?
Например для этого файла, я должен позвонить
imageView.setImageDrawable(null);
На каждом ImageView, когда всплывающее окно закрывается/активность закрыт (R.drawable. *)? Или просто когда я загружаю изображение из URL (с помощью Glide для примера) динамически?
Должен ли я всегда изменить размер изображения моего изображения? Что именно мне нужно очистить после закрытия фрагмента/действия?
Как вы думаете?
Это не ошибка утечки памяти, строго говоря. Вы пытаетесь выделить 1627572 байта в блоке. Это, вероятно, из ресурса, который можно использовать; полная проверка стека в LogCat поможет определить это. Этот блок эквивалентен 637x637-пиксельному изображению, которое довольно велико. Я предполагаю, что вы помещаете что-то в 'res/drawable /', предназначенное для более высокой плотности экрана (например, 'res/drawable-xhdpi /'). Тот факт, что у вас осталось только 1293760 байт кучного пространства *, является * признаком утечки памяти, но они могут быть далеки от этого кода. – CommonsWare
hey @CommonsWare благодарит за отзывчивость. Папка Drawable содержит только .xml-файлы. Большинство моих png уже находятся в папке drawable-xhdpi! – GuillaumeAgis
Хорошо, у вас есть довольно большой ресурс, который вы указываете в этом макете? – CommonsWare