java - 链接 Activity 会导致 OOM

标签 java android kotlin

我的任务是维护一个应用程序,该应用程序为用户所做的任何事情打开一个单独的 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>

最佳答案

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

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

关于java - 链接 Activity 会导致 OOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53756290/

相关文章:

java - 数组列表中的精确值

java - OnClickListener 不再起作用。

java - 更改 JTextPane EditorKit

android - 添加proguard后cordova的相机插件中的java NullPointerException

java - 在不使用正则表达式的情况下检查 String 是否包含 String[] 中存在的任何值 - Java

java - 无需修改 web.xml 的 Tomcat BASIC Auth

java - 尝试拦截 Retrofit 请求时出现未经授权的错误

java - Android中使用泰历解析特定格式的日期

android - RXKotlin中的存储库模式连接结果

coding-style - 由于 val 属性,无法从 init block 调用函数