我还是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);
答案 0 :(得分:2)
我来自YouTube视频,建议在上下文被要求作为参数时避免使用'this'
希望,这不是他们所说的,因为这将是一个糟糕的建议。
据我所知,Java的垃圾收集器无法捕获被引用的内容,当(从第一个youtuber)转动屏幕时 - 创建一个新实例 - 实际上是在没有收集旧实例的情况下启动新活动。导致泄漏。
对Activity
使用ArrayAdapter
实例不会造成内存泄漏。
两种情况似乎都会泄漏一点
两种情况消耗更多内存。这并不意味着泄漏。请记住,Android垃圾收集器并不是特别具有攻击性。仅仅因为你旋转屏幕并不意味着会立即收集每一点垃圾。
为什么显示器会泄漏少量内存?
没有。它表示你正在消耗少量的额外内存。
文档涵盖generating heap dumps,这是检测泄漏的一种方法。要检测泄露的活动,您还可以将LeakCanary集成到您的应用中。