2016-12-20 4 views
1

Знаете ли вы, как избежать утечек памяти?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 для примера) динамически?

Должен ли я всегда изменить размер изображения моего изображения? Что именно мне нужно очистить после закрытия фрагмента/действия?

Как вы думаете?

+2

Это не ошибка утечки памяти, строго говоря. Вы пытаетесь выделить 1627572 байта в блоке. Это, вероятно, из ресурса, который можно использовать; полная проверка стека в LogCat поможет определить это. Этот блок эквивалентен 637x637-пиксельному изображению, которое довольно велико. Я предполагаю, что вы помещаете что-то в 'res/drawable /', предназначенное для более высокой плотности экрана (например, 'res/drawable-xhdpi /'). Тот факт, что у вас осталось только 1293760 байт кучного пространства *, является * признаком утечки памяти, но они могут быть далеки от этого кода. – CommonsWare

+0

hey @CommonsWare благодарит за отзывчивость. Папка Drawable содержит только .xml-файлы. Большинство моих png уже находятся в папке drawable-xhdpi! – GuillaumeAgis

+0

Хорошо, у вас есть довольно большой ресурс, который вы указываете в этом макете? – CommonsWare

ответ

3

После немного копать я пришел с этими решениями:

https://medium.com/@multidots/glide-vs-picasso-930eed42b81d

  • Никогда не держите ссылки на активность из контекста в статике. НИКОГДА! В противном случае ваши ссылки могут по-прежнему присутствовать, даже если вам это нужно.

  • Избегайте использования ссылок на ImageViews.Перезагрузите/очистите растровое изображение внутри, когда вы уничтожите представление.

  • Если вам необходимо иметь ссылку контекста, пожалуйста, используйте context.getApplicationContext();

  • Не используйте context.getApplicationContext(); для LayoutInflater.from(context);, но непосредственно от контекста.

(в случае, если вам необходимо раздуть представление или создать контекст для чего-то). Если вы используете context.getApplicationContext(), это может привести к некоторым проблемам с дизайном при динамическом создании представлений.

  • Если вы получаете некоторые OutOfMemory ошибки, думаю, чтобы сжать изображения! Это на самом деле экономит много ошибок OutOfMemory. Вы можете использовать https://tinypng.com/.
  • Не помещайте по умолчанию изображения в папку вытяжки-xhdpi но вытяжка-MDPI вместо этого как вытяжки-MDPI по умолчанию один.

Так что для моего вопроса, я просто нужно сжимать изображения и положил их обратно в вытяжке-MDPI папку ! Все хорошо сейчас!

Смежные вопросы