我对 AdMob SDK 似乎正在使用的内存量以及此内存的实际位置感到困惑。让我解释一下。
我的应用程序有两种风格:免费和付费。免费版有AdMob广告,否则代码几乎相同(使用常见的Android lib)。
我在Nexus 4(Android 4.2.1)上运行应用程序并比较内存使用情况。 我查看应用程序在设备设置中使用的系统内存>应用>运行。 我还查看GC logcat消息报告的Dalvik堆内存,并使用HPROF文件。
当我运行付费版本时,我可以看到:
当我运行免费版时,我可以看到:
换句话说,两个版本的dalvik堆大小相似。 但实际使用的系统内存 10MB +更高!
花了很多时间学习内存分析(http://www.youtube.com/watch?feature=player_embedded&v=_CruQY55HOk),花了几个小时查看HPROF文件以消除任何可能的泄漏,我只能看到一个结论:
AdMob使用的10MB额外系统内存实际上是本机内存,使用malloc分配,在dalvik堆之外!
现在我想知道两件事:
非常感谢
答案 0 :(得分:13)
AdMob使用WebView加载广告。这是一个非常复杂的对象,它使用本机库,并且容易崩溃。 AdMob SDK非常难以使其易于管理,但您实际上无法控制其工作方式。此外,内存使用情况可能因广告类型而异:HTML文本与带图片的横幅等。
所以,除非你愿意二进制补丁AdMob(它不是开源的),否则你只需要忍受它。你可以主动删除和销毁AdView
以减少任何泄漏,但你可以做的更多。
答案 1 :(得分:8)
使用2个不同的AdMob实现测试我的应用程序后,我发现通过Java代码而不是XML实现它对应用来说更轻松。
更新No1:
您还可以在一段时间后添加自定义侦听器以进行销毁,并重新创建以便更好地处理它。 Serverside还有一个参数告诉应用广告应该多久要求新广告,我不确定它是否存在于所有情况下,但它适用于DFP广告管理系统帐户。
实施广告的好方法是:
new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if (!isBeingDestroyed) {
final AdRequest adRequest = new AdRequest();
final AdView adView = (AdView) findViewById(R.id.ad);
adView.loadAd(adRequest);
}
}).sendEmptyMessageDelayed(0, 1000);
也不要忘记调用adView.destroy()
onDestroy()活动,或者当你不再需要它时!
上面提到的here方法有许多有用的内存版本!
更新No2:(更新No1 的改进)
对建议的处理程序方式的改进。
使用这种方式可以避免(我希望)在发送延迟消息之前故意创建/销毁活动时可能堆叠的处理程序回调。如果您决定增加1000
毫秒,则更有可能发生这种情况:
为处理程序创建一个字段:
private adHandler;
在onCreate
:
adHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if (!isBeingDestroyed) {
final AdRequest adRequest = new AdRequest();
final AdView adView = (AdView) findViewById(R.id.ad);
adView.loadAd(adRequest);
}
return false;
}
});
adHandler.sendEmptyMessageDelayed(0, 1000);
在onDestroy
处,不要忘记“释放”处理程序:
adHandler.removeCallbacksAndMessages(null);
null删除所有回调,请参阅doc