Android,通过什么内存泄漏?语境?列表显示? SDK?

时间:2018-04-29 20:10:50

标签: android garbage-collection

我还是Java和Android的初学者。

最近,我发现了一个YouTube视频,建议避免使用这个'当上下文被要求作为参数时。 (:https://www.youtube.com/watch?v=gz7acZGaXoc&list=PLfuE3hOAeWhYlesGCkCU7xa4_SIfpLCgT&index=4

而且......这一切看起来都很好,也很合理。但是,我不太确定。

我开始学习Udacity的课程,他们(就我而言)总是使用'这个'作为获取当前上下文的关键字。例如:

ArrayAdapter<String> itemsAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, numberList);
        ListView listView = (ListView) findViewById(R.id.list);
        listView.setAdapter(itemsAdapter);

这似乎也合情合理。因为,当您参加活动时,您不会非常想要掌握应用程序的上下文。

据我了解,Java的垃圾收集器无法捕获被引用的内容,当(从第一个youtuber)转动屏幕时 - 创建一个新实例 - 实际上启动了一个新活动而没有收集老人。导致泄漏。

/ getApplicationContext()可能不是运行ListView的好选择,但为了试验和使用其他测试用例...... /

所以,我开始了一个没有转动屏幕的实验,但是......我只是通过一个明确的意图,返回,重做,返回,重做等来打开一个/新活动。同时我会运行ADB并查看内存使用情况。

这两种情况似乎都会泄漏一点(+/- 10次点击后爬升1MB)。它将以类似波浪的方式增加:开始(在y),开启(跳到x),向后(跳到y + 1),开启(跳到x + 1),向后(跳到y + 1 + 1) )等等。

所以我想问一下:这是由于使用上下文部分重用了吗?或者这里有其他的东西在玩吗?但在此之前,我决定回到完整的基础知识,删除一些代码,只是明确地打开一个新的活动,返回,打开等...相同的结果。

现在为了进一步测试,我把应用程序带到了后台,按下了主页,再次重新打开它,回到后台等等......这里也是同样的结果。

最终我最终得到了一个问题:这是正常的吗?或者......更多的事情。为什么显示器会泄漏少量内存? 它也可能不是应用程序中的泄漏,而是在合同中监控它的部分? 并且,如果,它实际上泄漏的原因是什么? 它是收藏家的一部分,我们应该和它一起生活吗?

旁注我的手机运行SDK&lt; 25。

其余代码:主要:

super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView NumbersList = (TextView) findViewById(numbers);
        NumbersList.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent numbersIntent = new Intent(MainActivity.this, NumbersActivity.class);
                startActivity(numbersIntent);
            }
        });

其余代码:活动:

super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_numbers);

1 个答案:

答案 0 :(得分:2)

  

我来自YouTube视频,建议在上下文被要求作为参数时避免使用'this'

希望,这不是他们所说的,因为这将是一个糟糕的建议。

  

据我所知,Java的垃圾收集器无法捕获被引用的内容,当(从第一个youtuber)转动屏幕时 - 创建一个新实例 - 实际上是在没有收集旧实例的情况下启动新活动。导致泄漏。

Activity使用ArrayAdapter实例不会造成内存泄漏。

  

两种情况似乎都会泄漏一点

两种情况消耗更多内存。这并不意味着泄漏。请记住,Android垃圾收集器并不是特别具有攻击性。仅仅因为你旋转屏幕并不意味着会立即收集每一点垃圾。

  

为什么显示器会泄漏少量内存?

没有。它表示你正在消耗少量的额外内存。

文档涵盖generating heap dumps,这是检测泄漏的一种方法。要检测泄露的活动,您还可以将LeakCanary集成到您的应用中。