Android - 避免内存泄漏的良好做法

时间:2016-12-20 22:43:05

标签: android performance memory memory-leaks imageview

您是否了解避免内存泄漏的良好做法?

我目前正在开发一个几乎没有内存泄漏的应用程序,我很难修复,主要是因为我不知道我需要采取哪些习惯才能避免它们。

例如,目前我遇到了这个问题

    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个ImageViews。以下是一个示例:

    <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。什么可能导致此dialogFragment出现内存泄漏错误?

2。 android中的任何好的做法都可以避免内存泄漏?

例如,对于那个文件,我应该打电话给

imageView.setImageDrawable(null);

在弹出窗口关闭/活动关闭(R.drawable。*)时的每个Imageview上?或者只是当我从URL(例如Glide)动态加载图像时?

总是是否应该将图片调整为我的Imageview尺寸? Fragment / Activity关闭后我到底需要清理什么?

你怎么看?

1 个答案:

答案 0 :(得分:3)

经过一番挖掘后,我带来了这些解决方案:

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

  • 永远不要在静态中保留上下文活动。决不! 否则,即使您需要,您的参考文献仍可能存在。

  • 避免保留ImageView的引用。在销毁视图时回收/清除内部的位图。

  • 如果您需要参考上下文,请使用context.getApplicationContext();

  • 请勿将context.getApplicationContext();用于LayoutInflater.from(context);,而应直接用于上下文。

(如果您需要为视图充气或需要上下文的话)。 如果使用context.getApplicationContext(),如果动态创建视图,则可能会导致一些设计问题。

  • 如果您遇到 OutOfMemory错误,请考虑压缩图片!它实际上节省了很多OutOfMemory错误。您可以使用https://tinypng.com/
  • 默认情况下,不要将您的图片放入 drawable-xhdpi 文件夹中,而是 drawable-mdpi ,因为 drawable-mdpi 是默认设置之一。

因此,对于我的问题,我只需要压缩图片并将它们放回 drawable-mdpi 文件夹中!现在好了!