Android 版 AdMob (SDK 7.0) 上的 AdActivity 泄漏

2023-11-24

我有关于内存泄漏Interstitial ads of AdMob with AdActivity目的。每当广告出现时,AdActivity内存中的对象计数增加 1。我通过以下方式检查所有更改MAT明确后GC来电。我使用所有东西的最新版本。

起初,我认为这与我实现 UI 或项目的方式有关,但创建一个新的空项目会显示相同的泄漏。

之前也出现过这种泄露Admob SDK(Google Play 服务)现在它也存在于 7.0 版本中。

我看到人们试图通过创建一个SingleInstance空活动只是为了显示并设置为插页式广告的上下文。我尝试了所有方法,但它们对我的情况不起作用。有些确实有帮助,但由于我的应用程序的流程,我什至无法使用它。launchModeAndroid 有局限性,它对我的​​情况没有帮助。

我已经通知了 AdMob 团队,但即使他们修复了这个问题,似乎也不会在短时间内发生,因为他们刚刚发布了 7.0 版 SDK。

我不明白为什么其他人不报告这样的泄漏。这不能只是我的特例,因为它甚至发生在样本或默认模板上。如果有人以某种方式解决了这个问题(包括丑陋的反射黑客),请分享您的经验。我已经为此工作了几个月!真的吗!

Android 清单:

<uses-sdk
    android:minSdkVersion="9"
    android:targetSdkVersion="22" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application
    android:name="MyApplication"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.google.android.gms.ads.AdActivity"
        android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
        android:theme="@android:style/Theme.Translucent" />
</application>

主要活动:

package com.example.leaktest1;

import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.InterstitialAd;

import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {

    private InterstitialAd interstitial=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        interstitial= new InterstitialAd(getApplicationContext());
        interstitial.setAdUnitId("YOUR-ADD-ID");

        AdRequest adRequest2 = new AdRequest.Builder()
        // .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
                .build();

        interstitial.setAdListener(new AdListener() {
            @Override
            public void onAdLoaded() {          
                super.onAdLoaded();

                if(interstitial.isLoaded()){
                    interstitial.show();
                }
            }
        });
        interstitial.loadAd(adRequest2);
    }


    @Override
    protected void onDestroy() {
        if(interstitial!=null){
            interstitial.setAdListener(null);
            interstitial=null;
        }
        super.onDestroy();
    }     
}

Layout:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.leaktest1.MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>
  • 启动应用程序。显示广告后,通过后按将其关闭,然后再次点击后退按钮以退出应用程序。
  • 应用程序仍将在内存中,但活动已消失。现在触摸应用程序图标再次启动活动,它将再次显示广告,像以前一样退出。
  • Cause GC multiple times and get heap dump. You will see that there are 2 AdActivity objects (and also many other related objects). It will continue to grow according to the number of shown ads. enter image description here

以下也不起作用(它仍然泄漏):

/*
interstitial.setAdListener(new AdListener() {
    @Override
    public void onAdLoaded() {          
        super.onAdLoaded();
    }
});*/
interstitial.loadAd(adRequest2);

Runnable r=new Runnable() {
    @Override
    public void run() {
                if(interstitial.isLoaded()){
                    interstitial.show();
                }
}};
new Handler().postDelayed(r,10000);

将代码放入按钮中也不起作用(它仍然泄漏):

Button b = new Button(this);
b.setText("Touch me");
b.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        if(interstitial.isLoaded()){
            interstitial.show();
        }
    }
});
ViewGroup v = (ViewGroup) this.findViewById(android.R.id.content);
v.addView(b);

泄露平台及异常:此泄漏发生在三星和华硕的各种未修改的设备上(原厂固件)Android系统从2.3到4.4。它也会发生在 Android 模拟器的任何设置上。

(此泄漏不会出现在 root Cyanogenmod (Galaxy S3) Android 4.4.4 上)

UPDATE

The leak does not vanish if I use Activity context instead of Application context. It also causes Activity leak too. enter image description here

enter image description here

enter image description here


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 版 AdMob (SDK 7.0) 上的 AdActivity 泄漏 的相关文章

  • 如何做Android - 滑动抽屉从左到右滑动..?

    如何将android滑动抽屉从LTR滑动 使用时android orientation horizontal 它从 RTL 滑出 我该如何进行 LTR 谢谢 我找到了答案表格 Here http blog sephiroth it 2011
  • 在 Android 上通话结束时启动活动

    我想在通话结束时启动一项活动 找不到任何对此的参考 我该怎么做 我还没有尝试过这个 但我假设你可以运行一些服务 始终在后台运行 它利用电话状态监听器 http developer android com reference android
  • 我在布局上看不到任何 FirebaseRecyclerAdapter 项目

    我试图将数据从 Firebase 数据库检索到我的布局 但我看不到任何项目FirebaseRecyclerAdapter在布局中 请帮忙 我按照一个教程展示了如何做到这一点 当我运行应用程序时 我没有看到任何项目 但我可以滚动 public
  • Android短音的正确播放方法?

    我正在创建一个应用程序 屏幕上将有多个图像 这些图像将是按钮 点击时会播放短促的声音 我对此进行了研究 只能找到我当前用来播放声音的方法 这似乎根本没有响应 我希望声音能够快速播放并且能够响应多次快速点击 我不确定这在 Android 中是
  • Cheesesquare:enterAlways 会产生错误的布局

    Adding enterAlways到 Cheesesquare 演示的滚动标志
  • Xamarin Android Webview Javascript

    我正在尝试通过 Xamarin for Android 创建一个移动应用程序 它有一个显示网站的 WebView 问题是正常按钮会触发 但 javascript 事件不会触发 我已经启用了 Javascript 但没有运气 如何在 Andr
  • 如何在android中显示保存在sdcard文件夹中的图像[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 当我正在显
  • Android 初学者:Android gridview 中的触摸事件

    我正在使用以下代码来使用 gridview 执行操作 稍作修改http developer android com resources tutorials views hello gridview html http developer a
  • Android应用程序组件销毁和重新创建的详细信息

    有人可以向我提供一些具体的 值得信赖的 最好是简洁的 信息 内容如下 系统销毁和 如果适用 重新创建组件的顺序 片段 活动 活动的线程 异步任务 计时器 静态数据 类何时卸载 其他类中的线程 异步任务 定时器 主机 TabActivity
  • 自定义首选项中的android首选项水平分隔线?

    我创建了自己的自定义首选项对象来扩展首选项 我创建它们只是因为这些自定义数据类型没有首选项 一切正常 但我的自定义首选项没有相同的外观 因为它们缺少系统首选项对象具有的水平分隔线 我已经查找了创建水平分隔线的代码 但我找不到它是在哪里完成的
  • Bitmap.getPixels() 中的 IllegalArgumentException

    我想将数据从位图复制到int using getPixels 这是我当前的代码 int pixels new int myBitmap getHeight myBitmap getWidth myBitmap getPixels pixel
  • 当它的父级是 ConstraintLayout 时设计 CardView 吗?

    我在编辑包含Relativelayout的Cardview内的RelativeLayout时搞砸了 ConstraintLayout会将相对布局的wrap content更改为0并添加工具 layout editor absoluteX 1
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • Dagger 2 没有生成我的组件类

    我正在使用 Dagger 2 创建我的依赖注入 几个小时前它还在工作 但现在不再生成组件 这是我创建组件的地方 public class App extends Application CacheComponent mCacheCompon
  • Android Studio 缓慢的增量构建

    我已经完成了许多步骤来完善我们的构建系统 those https stackoverflow com questions 16775197 building and running app via gradle and android st
  • 上网本上可以进行Android开发吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用我的上网本进行 Android 开发 但是当我尝试使用 Eclipse 运行 SDK 时 没有加载任何内容 上网本对于 Android 开发来
  • Android - 以编程方式选择菜单选项

    有没有办法以编程方式选择菜单选项 基本上 我希望视图中的按钮能够执行与按特定菜单选项相同的操作 我正在考虑尝试调用 onOptionsItemSelected MenuItem item 但我不知道要为菜单项添加什么 是的 有一种方法可以选
  • 没有支持 FEATURE_CAMERA_EXTERNAL 的 Android 设备

    根据this doc https source android com devices camera external usb cameras一些 Android 设备允许使用 Camera2 API 访问外部 USB 摄像头 我检查了大约
  • 如何使用 AccessibilityService 在 Android 中模拟按键

    我正在编写一个辅助服务 我一直在尝试在应用程序上进行一些自动搜索 我使用accessibilityservice action paste来填充EditText 然后我需要模拟软键盘上的按键 但我不知道如何做 你们能帮我一下吗 你可以尝试A

随机推荐