小编Max*_*org的帖子

Backstack上的Android碎片占用了太多内存

问题:

我有一个Android应用程序,允许用户浏览用户的个人资料ViewProfileFragment.在ViewProfileFragment用户内部可以点击图像,将他带到StoryViewFragment各种用户的照片显示的位置.可以单击用户配置文件照片,将其带到ViewProfileFragment新用户配置文件的另一个实例.如果用户反复单击用户的配置文件,则单击将图像带到图库的图像,然后单击另一个配置文件,碎片在内存中快速堆叠,从而导致可怕的情况OutOfMemoryError.这是我描述的图表流程图:

UserA点击了Bob的个人资料.在Bob的个人资料中,UserA点击了ImageA,将他带到了各种用户(包括Bob's)的照片库中.UserA点击Sue的个人资料然后点击她的一个图像 - 处理重复等等.

UserA -> ViewProfileFragment
         StoryViewFragment -> ViewProfileFragment
                               StoryViewFragment -> ViewProfileFragment
Run Code Online (Sandbox Code Playgroud)

因此,从典型的流程中可以看出,在Backstack中有很多实例ViewProfileFragmentStoryViewFragment堆积.

相关代码

我使用以下逻辑将它们作为片段加载:

//from MainActivity
fm = getSupportFragmentManager();
ft = fm.beginTransaction();
ft.replace(R.id.activity_main_content_fragment, fragment, title);
ft.addToBackStack(title);
Run Code Online (Sandbox Code Playgroud)

我做了什么

1)我特意使用,FragmentTransaction replace以便onPausereplace发生时触发该方法.在内部onPause我试图释放尽可能多的资源(例如清除ListView适配器中的数据," 清空"变量等),这样当片段不是活动片段并被推到backstack时会有更多的内存释放.但我释放资源的努力只取得了部分成功.根据MAT,我仍然有很多内存消耗GalleryFragmentViewProfileFragment.

2)我也删除了对addToBackStack()的调用,但显然这提供了糟糕的用户体验,因为它们无法遍历(当用户点击后退按钮时应用程序才会关闭).

3)我使用MAT来查找占用大量空间的所有对象,并且我已经在onPause(和onResume)方法中以各种方式处理这些对象以释放资源,但它们的大小仍然很大.

在此输入图像描述

4)我还在两个片段中写了一个for循环' onPause,它ImageViews使用以下逻辑将我的所有设置为null:

 for (int i=shell.getHeaderViewCount(); i<shell.getCount(); i++) {

     View h …
Run Code Online (Sandbox Code Playgroud)

android memory-leaks out-of-memory android-fragments

22
推荐指数
2
解决办法
1万
查看次数

正确的方法来计算保持纵横比的最佳相机预览尺寸

如何以编程方式准确地确定在设备屏幕尺寸上显示摄像头预览的应用程序的最佳预览大小?(或者在可变尺寸的任何视图中,真的).

在您尝试将其标记为数百万其他方面比例之一的相关问题之前,请理解我正在寻找与通常可用的解决方案不同的解决方案.我问这个问题,因为我已经阅读了很多"答案",但他们都指出了一种我认为不完整的解决方案(并且可能存在缺陷,我将在这里描述).如果这不是一个缺陷,请帮助我理解我做错了什么.

我已经阅读了很多关于应用程序如何选择预览大小的不同实现,并且大多数采用的方法是我称之为"足够接近"的方法(您可以根据减去大小选项的比例来确定哪个选项最佳)屏幕分辨率的比率,并找到具有最低值的选项).这种方法似乎无法确保它选择最佳选择,但确保它不会选择最差的选项.

例如,如果我尝试在屏幕分辨率为的设备上迭代每个可用的预览大小720x1184并显示预览全屏(720x1184),这里是相机预览的结果(按照格式中最接近屏幕分辨率的选项排序abs(ratio of size option - screen resolution ratio)) .所有尺寸均来自.getSupportedPreviewSizes).("结果"来自使用测试用例的视觉观察,使用静态圆圈出现在相机的取景器中并且不是程序化的)

720.0/1184.0 = 0.6081081081081081

Res         Ratio         Delta in ratios  Result       
----------------------------------------------------   
176/144   = 1.22222222222 (0.614114114114) (vertically stretched)
352/288   = 1.22222222222 (0.614114114114) (vertically stretched)
320/240   = 1.33333333333 (0.725225225225) (vertically stretched)
640/480   = 1.33333333333 (0.725225225225) (vertically stretched)
720/480   = 1.5           (0.891891891892) (vertically stretched)
800/480   = 1.66666666667 (1.05855855856)  (looks good)
640/360   = 1.77777777778 (1.16966966967)  (horizontally squashed) …
Run Code Online (Sandbox Code Playgroud)

java android aspect-ratio android-camera cwac-camera

7
推荐指数
1
解决办法
5099
查看次数