您是否了解避免内存泄漏的良好做法?
我目前正在开发一个几乎没有内存泄漏的应用程序,我很难修复,主要是因为我不知道我需要采取哪些习惯才能避免它们。
例如,目前我遇到了这个问题
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关闭后我到底需要清理什么?
你怎么看?答案 0 :(得分:3)
经过一番挖掘后,我带来了这些解决方案:
https://medium.com/@multidots/glide-vs-picasso-930eed42b81d
永远不要在静态中保留上下文的活动。决不! 否则,即使您需要,您的参考文献仍可能存在。
避免保留ImageView的引用。在销毁视图时回收/清除内部的位图。
如果您需要参考上下文,请使用context.getApplicationContext();
请勿将context.getApplicationContext();
用于LayoutInflater.from(context);
,而应直接用于上下文。
(如果您需要为视图充气或需要上下文的话)。 如果使用context.getApplicationContext(),如果动态创建视图,则可能会导致一些设计问题。
因此,对于我的问题,我只需要压缩图片并将它们放回 drawable-mdpi 文件夹中!现在好了!