mus*_*ikk 21 memory android admob
我很困惑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堆之外!
现在我想知道两件事:
非常感谢
Nik*_*kov 13
AdMob使用WebView加载广告.这是一个非常复杂的对象,它使用本机库,并且容易崩溃.AdMob SDK非常难以使其易于管理,但您实际上无法控制其工作方式.此外,内存使用情况可能因广告类型而异:HTML文字与带图片的横幅等.
因此,除非您愿意对AdMob进行二进制修补(它不是开源),否则您只需要使用它.你可以AdView主动删除和销毁,以减少任何泄漏,但你可以做的更多.
通过2个不同的AdMob实现测试我的应用程序后,我发现通过Java代码而不是XML实现它对应用来说更轻松.
更新1号:
您还可以在一段时间后添加自定义侦听器以进行销毁,并重新创建以便更好地处理它.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);
Run Code Online (Sandbox Code Playgroud)
也不要忘记调用adView.destroy()onDestroy()活动或当你不再需要它时!
更新No2 :( 更新No1的改进)
对建议的处理程序方式的改进.使用这种方式可以避免(我希望)在发送延迟消息之前故意创建/销毁活动时可能堆叠的处理程序回调.如果您决定增加1000毫秒,则更有可能发生这种情况:
为处理程序创建一个字段:
private adHandler;
Run Code Online (Sandbox Code Playgroud)
在你的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);
Run Code Online (Sandbox Code Playgroud)
在你onDestroy不要忘记"释放"处理程序:
adHandler.removeCallbacksAndMessages(null);
Run Code Online (Sandbox Code Playgroud)
null删除任何回调,请参阅doc