小编Emi*_*nin的帖子

为什么重新启动活动时堆内存会增加?

这个问题与Android中的内存有关.

我的方法:

我有两个活动,A和B.从A,我这样启动B:

Intent i = new Intent(A.this, B.class);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)

在按钮上单击B,我这样做:

B.this.finish();
Run Code Online (Sandbox Code Playgroud)
  • 在B中,我重写onDestroy方法并将所有引用设置为null.
  • 我没有在A的onResume方法中分配新的内存.
  • 我没有泄露上下文.
  • 我没有使用多个线程.
  • 我没有使用服务.
  • B中的所有变量都是私有类变量,并且所有这些变量都在B的onDestroy中设置为null.
  • 此外,B中的ImageViews在onDestroy of B中将其背景设置为null.
  • 我确信B会被摧毁.

结果:

当我在活动A中时,堆内存为7.44 MB.然后,当我启动B并在B上调用完成(从而返回到A)时,堆增加了0.16 MB.再次重复此过程,堆每次增加0.08 MB.

  • 我没有查看堆限制,我正在查看分配的堆.
  • 我在B的onDestroy方法的末尾调用System.gc().

附加信息:

- 我使用MAT来分析内存分配并试图找到这个漏洞.奇怪的是,活动B似乎有5个实例.碰巧的是,我重复了startActivity/finish过程5次.底部条目是活动,其他条目是活动中的监听器:

在此输入图像描述

这是统治者树的截图.我找不到任何异常或怀疑的东西.

支配树

- 我已经观看了关于内存使用(和泄漏)的谷歌IO视频.

题:

无论我做什么,是否有可能始终分配这个0.08 MB的堆(并且不能由GC收集)?如果没有,任何可能导致这种情况的想法?

更新:

  1. 我试图在没有在B中设置内容视图的情况下启动活动B.这意味着B是一个完全空的活动.结果是当我多次重新启动活动时堆内存没有增加.但请注意,这不是解决方案.我必须能够设置内容视图.

  2. scorpiodawg:我尝试在模拟器上运行我的应用程序,堆仍在增长.不错的尝试.

  3. ntc:我把所有出现的"this"更改为"getApplicationContext()"尽可能的地方.我无法调用setContentView(getApplicationContext()); 因为setContentView需要对布局文件的引用,而不是上下文.我做的是创建一个空的布局文件并调用setContentView(emptylayout); 在活动B的onDestroy方法中.这没有帮助.

  4. 我试图删除所有代码,以便只调用setContentView(mylayout).问题持续存在.然后我删除了布局XML文件中的所有gui元素.问题持续存在.唯一剩下的就是容器视图,几个嵌套的线性,相对和滚动布局.我试图删除滚动条中的"android:scrollbarDefaultDelayBeforeFade"属性.结果很好,内存泄漏消失了.然后我放回了我之前删除的所有代码但没有设置"android:scrollbarDefaultDelayBeforeFade"属性并且内存泄漏又回来了.这有多奇怪?

java android memory-leaks memory-management

13
推荐指数
1
解决办法
5292
查看次数

如何防止Gamecih作弊?

背景

我已经有很长一段时间没有问题,玩家在我的安卓游戏中作弊.对于严格的单人游戏来说,这不是一个大问题,但由于我的游戏包含多人战斗和全球高分榜,因此这会让合法玩家因为骗子而停止游戏.

他们如何作弊

骗子使用一个名为Gamecih的 root用户的应用程序.Gamecih允许用户暂停应用,更改变量值,然后恢复应用.所以在我的情况下,他们只是暂停游戏,将"健康"改为74万亿,然后在多人游戏中将所有人从垃圾中剔除.这是一段视频,展示Gamecih如何在水果忍者(不是我的游戏)中作弊.

考虑方法

  1. 代码混淆.这是行不通的,因为混淆不会改变变量,只改变变量.这意味着作弊者仍然可以找到与其当前健康状况具有相同值的变量,然后更改该变量.
  2. 代码混淆+ getter和setter值更改.这样,健康实际上不会代表真正的健康价值.在getter方法中,我会做一些像返回健康*10; 在设定者中我会做健康=输入/ 10; 这当然可能更复杂.

我想要的是

可以说,考虑到方法nr 2是我应该使用的,但是再一次,它不会阻止黑客攻击,它只会使它变得更难.理想情况下,我想检测人们何时使用Gamecih作弊,显示弹出式文字"Darn you,you nasty hacker",然后关闭应用程序.我想要依赖服务器的解决方案,因为我希望我的玩家能够在离线时玩游戏.如果可能的话,我还想避免代码混淆.

java android anti-cheat

12
推荐指数
3
解决办法
5858
查看次数

分配跟踪器:如何使用它来检测内存泄漏?

我有两个活动:A和B.从A开始,我转到活动B.然后我在B上调用finish()并返回A.每次重复此过程时,分配的内存增加0.1 MB.

所以我想找出造成这种泄漏的原因.我试图通过在刚才提到的过程中跟踪分配的内存来使用分配跟踪器.然后,当我按下"获取分配"时,我会获得一长串分配.我的问题是:我如何阅读该列表以找出导致我泄漏的原因?

我试图通过释放活动B的onDestroy方法中的所有资源来解决这个问题,这有点帮助.而且,我没有在活动A的onResume方法中分配新的内存.

只是为了表明我正在使用分配跟踪器:

在此输入图像描述

android

10
推荐指数
1
解决办法
6252
查看次数

位图转换:创建从透明位图中排除透明边的位图

我有一组位图.它们在某种程度上都是透明的,我事先并不知道哪些部分是透明的.我想从原始位图创建一个新的位图,它排除透明部分,但是在正方形中.我认为这张图片解释了它:

在此输入图像描述

我知道如何从现有位图创建位图,但我不知道如何找出哪个部分是透明的以及如何使用它来实现我的目标.

这就是我计划这样做的方式:

public Bitmap cutImage(Bitmap image) {
        Bitmap newBitmap = null; 

        int width = image.getWidth(); 
        int height = image.getHeight(); 

        newBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 

        Canvas canvas = new Canvas(newBitmap); 

        //This is where I need to find out correct values of r1 and r1.

        Rect r1 = new Rect(?, ?, ?, ?);
        Rect r2 = new Rect(?, ?, ?, ?);

        canvas.drawBitmap(image, r1, r2, null);

        return newBitmap; 
     }
Run Code Online (Sandbox Code Playgroud)

有谁知道如何实现这一目标?

编辑:

我使用以下算法来查找left,right,top和bottom值:

private int x1;
private int x2;
private int y1;
private …
Run Code Online (Sandbox Code Playgroud)

java android bitmap image-processing

8
推荐指数
2
解决办法
2387
查看次数

Android,如何围绕固定点旋转箭头(图像)?

我有一个箭头图像,我想从0到180度旋转(就像一米中的针.)箭头的一个点固定在屏幕的中间和底部,箭头应该移动.箭头长度固定(是图像).此外,我有两个按钮,我希望在触摸按钮时左箭头向左转,当触摸右按钮时向右转.

这个过程的逻辑是什么?

在此输入图像描述

android image point rotation

8
推荐指数
2
解决办法
9841
查看次数