android - 为什么我的 Android 应用程序占用过多内存?

标签 android android-fragments android-recyclerview android-glide

情况是这样的: 我有一个 Activity,它有一个工具栏、一个 Tablayout 和一个 View Pager(将包含 5 个 fragment )

在第一个 fragment 中,我有一个布局,将包含一个默认 fragment ,该 fragment 将有一个包含两列的 Recycler View 。这上面的每个元素都有一个从互联网下载的图像(使用 Glide 并保存在缓存中),当用户点击持有者(列表的一个元素)时,会将“布局容器”上的这个默认 fragment 更改为另一个将有一个新的 Recycler View,其中包含使用 Glide 从 Internet 下载的图像。类似于 Instagram 搜索页面。

我认为 Glide 是问题所在,但我注释了所有代码,当我在模拟器上运行该应用程序时,它消耗了 89 MB 的 RAM 或多或少。

额外信息

  • 任何 fragment 中 RView 上的每个元素都是通过使用 Volley 下载 JSONArray 创建的,我将请求放入 MySingleton 队列并将上下文定义为 getContext()(我应该使用 getActivity().ApplicationContext() 而不是 getContext( ) 当代码来自 fragment 时? )

(在 Activity 内的 View 寻呼机内的 fragment 内)

MySingleton.getInstance(getContext()).addToRequestQueue(req);

然后它下载图片 URL 并使用 Glide 在 View 上收费。

if(holder.publication.getPicture() != null ){
        Glide.with(holder.ctx).load(holder.publication.getPicture()).diskCacheStrategy(DiskCacheStrategy.ALL).centerCrop().into(holder.picture_imgView);
    }
  • 我没有使用静态变量

  • 此外,我从 Recycler View 元素中删除了所有动画,但速度仍然很慢。

  • 我使用 Android 监视器和“Jump Java Heap”选项来查看它是如何管理内存的,主要编号在 Byte[] 上(我不明白如何使用这个工具)

非常感谢!

更新 在我的日志中,我总是得到这个:

W/ViewRootImpl: Dropping event due to no window focus: KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_BACK, scanCode=0, metaState=0, flags=0xc8, repeatCount=1, eventTime=18009881, downTime=18009352, deviceId=-1, source=0x101 }

I/Choreographer: Skipped 98 frames!  The application may be doing too much work on its main thread.

最佳答案

好吧,我想我找到了解决方案并且我已经得出以下结论:

  • 使用 .jpg 格式的可绘制对象或任何大于 150kb 的文件都会占用内存。就我而言,我使用非常大的图像作为背景,在回收站 View 中使用小图像但大于 200kb。那些正在杀死拉姆。
  • 最好在调用 Volley Request 时使用 fragment 的本地上下文 (getContext()) 并将其放入 MySingleton 队列。
  • recyclerViews 上的 Holder 应该是静态内部类,因为您要重复使用它们,这是节省内存的好方法。
  • 如果您在每个 Holder 上使用 Glide 下载图片并且有一些链接是空的,您应该清理 ImageView:Glide.clear(ImgView);
  • 为调用 SharedPreferences 创建对象不是一个好主意。最好使用一个全局类,它使用一个上下文(包含所有 fragment 的 Activity )并从那里调用 SharedPreferences。类似于:MyCallerClass.getInstance().getPrefsDataOfOuser();

所有这些都是我这些天得出的结论...现在我的应用程序使用 50mb 的内存下载带有 Glide 的图像和 80mb 或 90mb 的最大内存用于实时搜索...

关于android - 为什么我的 Android 应用程序占用过多内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37801392/

相关文章:

android - Intent extra 返回 null

android - 如何使用 DiffUtils 更新 RecyclerView 中的列表?

java - 如何从非 Activity 或 fragment 类的资源文件中获取字符串

android - 如何使用 webview 将 paypal 集成到 android 应用程序

java - 什么是 getStringExtra 格式

java - 无法访问 ListView 内的 TextView

java - RecyclerView 的 onClick 方法使应用程序崩溃

android - 使用 putExtra 传递 ArrayList<Object> 数据

java - 安卓开发 : How To Get All EditText Children of a ViewGroup?

android - 如何在屏幕旋转时保留 View Pager 的 fragment ?