我的任务是维护一个应用程序,该应用程序为用户所做的任何事情打开一个单独的 Activity 。是的,这是一个旧应用程序,我计划很快对其进行升级。
在分析过程中,我发现打开相同的 Activity (不同的数据和所有数据)时,图形内存占用大量内存。
我使用标准的 recyclerview
和一个名为 rv-joiner 的库来实现多适配器,并使用 Glide 来加载图像。
问题是,我尝试清空recyclerview
并清除Pause上的数据,希望内存能够清理干净,但没有成功。
我也尝试使用Glide.get(context).clearMemory()
,结果相同。
有什么改进内存管理的建议吗?
布局:
<?xml version="1.0" encoding="utf-8"?>
<data>
</data>
<android.support.design.widget.CoordinatorLayout
android:id="@+id/coordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/backgroundColor"
android:fitsSystemWindows="true"
android:layoutDirection="ltr"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/applicationBar"
android:layout_width="match_parent"
android:layout_height="@dimen/app_bar_height"
android:background="@null"
android:layoutDirection="ltr"
android:fitsSystemWindows="true"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:minHeight="0dp"
android:textAlignment="viewStart"
app:contentScrim="@color/colorPrimary"
app:layout_scrollFlags="scroll|exitUntilCollapsed|enterAlwaysCollapsed">
<ImageView
android:id="@+id/post_cover"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:background="@null"
android:fitsSystemWindows="true"
android:scaleType="centerCrop"
android:tint="#66000000"
app:layout_collapseMode="parallax" />
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="56dp"
android:alpha="1.0"
android:background="#00000000"
android:minHeight="56dp"
android:theme="@style/toolBarStyle"
app:layout_collapseMode="pin"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/toolbar_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="23dp"
android:ellipsize="end"
android:maxLines="1"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textColor="@color/white"
android:textDirection="ltr"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/action_share"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/action_favorite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:padding="8dp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/action_share"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:padding="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/action_favorite"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_action_share" />
</android.support.constraint.ConstraintLayout>
</android.support.v7.widget.Toolbar>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_post"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
</android.support.v7.widget.RecyclerView>
<ProgressBar
android:id="@+id/loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
</android.support.design.widget.CoordinatorLayout>
最佳答案
- 清空回收器 View 是不合理的,因为它在默认设置下仅使用 5-8 个 View 。也许每个观点都相当沉重。只需用一个、两个、三个等项目填充适配器,然后看看它消耗了多少内存。
- Glide 是一个很棒的图像处理库(不仅仅是图像下载器),因此请充分利用它的所有功能。您可以从对图像进行下采样并更改其大小开始。接下来 - 检查是否有任何位图。它们会消耗大量内存,因此最好将它们转换为可绘制对象之类的东西。
- Lottie 和其他动画处理库。我在我的一个项目中使用了lottie,我注意到较重的动画是UI 较慢的。因此,如果您有一个 - 将动画的 json 减少到最大 50 kb。
- 多线程和并发。根据我的经验,我可以说很多开发人员在 UI 线程上做了太多工作。将业务逻辑和 UI 逻辑分开,以避免 UI 缓慢。最好将 MVVM 模式与 Android Jetpack 结合使用。
- 流。关闭 onPause() 中的所有流(包括游标等),因为它们会消耗大量进程资源。
- 上下文。只是不要将您的上下文存储在应用程序中的任何位置。
- 使用大堆。将 android:largeheap="true"添加到 list 中的应用程序标记中。
这是一般规则,但如果我是你,我会简单地放置大量断点并在每个执行行之后监视内存消耗。
关于java - 链接 Activity 会导致 OOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53756290/