链接活动导致OOM

时间:2018-12-13 06:40:48

标签: java android kotlin

我的任务是维护一个能够为用户所做的任何事情打开单独活动的应用程序。是的,它是一个旧的应用程序,我打算尽快对其进行升级。

在分析过程中,我发现打开相同的活动(不同的数据和全部)时,图形内存占用了很多内存。

我正在使用标准的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>

1 个答案:

答案 0 :(得分:1)

  1. 清空回收站视图是不合理的,因为它仅使用5-8个具有默认设置的视图。每个视图可能都很繁重。只需用一个,两个,三个等项目填充适配器,然后查看它消耗了多少内存。
  2. Glide是一个很棒的图像处理库(不仅是图像下载器),因此请尽其所能。您可以先对图像进行下采样并更改其大小。接下来-检查是否有任何位图。它们消耗大量内存,因此最好将它们转换为可绘制对象。
  3. Lottie和其他动画处理库。我在我的一个项目中使用了抽奖活动,并且我注意到较重的动画是UI较慢。因此,如果您有一个-将动画的json减少到最大50 kb。
  4. 多线程和并发。根据我的经验,我可以说很多开发人员在UI线程上做的工作太多。将业务逻辑和UI逻辑分开,以避免UI变慢。最好在Android Jetpack中使用MVVM模式。
  5. 流。关闭onPause()中的所有流(包括游标等),因为它们会消耗大量的处理资源。
  6. 上下文。只是不要将上下文存储在应用程序中的任何位置。
  7. 使用大堆。将android:largeheap =“ true”添加到清单中的应用程序标签。

这是一般规则,但是如果我是我,我会在每个执行的行之后简单地放置很多断点并监视内存消耗。