Android AdView 泄漏,可能是由于某些内部后台线程造成的

2024-03-02

我在由片段创建的窗口中显示 AdMob 广告横幅。这有效,但我遇到了奇怪的泄漏问题,我还不明白。当我多次打开和关闭应用程序时,广告片段每次都会被正确销毁,但控制该片段的 MainActivity 正在泄漏:

有罪的是代码中的这一行:

adRequest = new AdRequest.Builder().addTestDevice(DEVICE_ID_MOTO_G).addTestDevice(DEVICE_ID_ZTE).build();
mAdView.loadAd(adRequest);

(您可以在下面看到我已经尝试使 adRequest 无效,但没有结果。)无论如何,当我注释这两行时,不会发生泄漏。我测试了两次,因为很难相信这个调用会泄漏,但它确实发生了。这是片段代码。正如你所看到的,我什至取消了一切可能的事情onDestroy()。我可以保证onDestroy()叫做。loadAd启动任何后台线程。我想这与这个问题有关。

public class SnippetFragment extends Fragment
{
    private AdView mAdView;
    private OnAdFinishedLoadingListener onAdFinishedLoadingListener;
    private Context context;
    private AdRequest adRequest;

    private final String DEVICE_ID_ZTE = "1CA20334345BB1479C43692AFA576456487A48";
    private final String DEVICE_ID_MOTO_G = "131465469A7BE11543543065404B168908CB13C8D1";

    public SnippetFragment(Context context)
    {
        this.context = context;
    }

    @Override
    public void onActivityCreated(Bundle bundle)
    {
        super.onActivityCreated(bundle);

        mAdView = (AdView)getView().findViewById(R.id.adView);
        mAdView.setAdListener(new AdListener()
        {
            @Override
            public void onAdLoaded()
            {
                super.onAdLoaded();

                if (context != null)
                {
                    onAdFinishedLoadingListener = (OnAdFinishedLoadingListener)context;
                    onAdFinishedLoadingListener.onAdLoaded();
                }
            }
        });

        //THIS SOMEHOW LEAKS!
        adRequest = new AdRequest.Builder().addTestDevice(DEVICE_ID_MOTO_G).addTestDevice(DEVICE_ID_ZTE).build();
        mAdView.loadAd(adRequest);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.fragment_snippet, container, false);
    }

    /** Called when leaving the activity */
    @Override
    public void onPause()
    {
        if (mAdView != null)
        {
            mAdView.pause();
        }
        super.onPause();
    }

    /** Called when returning to the activity */
    @Override
    public void onResume()
    {
        super.onResume();
        if (mAdView != null)
        {
            mAdView.resume();
        }
    }

    /** Called before the activity is destroyed */
    @Override
    public void onDestroy()
    {
        adRequest = null;

        if (mAdView != null)
        {
            mAdView.setAdListener(null);
            mAdView.destroy();
            mAdView = null;
        }

        context = null;

        super.onDestroy();
    }
}

幸运的是我找到了解决方案。在片段被销毁之前,您必须手动将 AdView 从周围布局中踢出。在我启动和关闭应用程序大约 20 次后,不再出现泄漏。这是更新后的片段:

public class SnippetFragment extends Fragment
{
    private AdView adView;
    private OnAdFinishedLoadingListener onAdFinishedLoadingListener;
    private Context context;
    private LatLng routeDestination;
    private AdRequest adRequest;
    private LinearLayout snippetContent;

    private final String DEVICE_ID_ZTE = "2353496z35752t3524267854";
    private final String DEVICE_ID_MOTO_G = "4568735862378523675427897";

    @Override
    public void onActivityCreated(Bundle bundle)
    {
        super.onActivityCreated(bundle);

        snippetContent = (LinearLayout)getView().findViewById(R.id.snippet_content);
        adView = (AdView)getView().findViewById(R.id.adView);
        adView.setAdListener(new AdListener()
        {
            @Override
            public void onAdLoaded()
            {
                super.onAdLoaded();

                if (context != null)
                {
                    onAdFinishedLoadingListener = (OnAdFinishedLoadingListener)getActivity();
                    onAdFinishedLoadingListener.onAdLoaded();
                }
            }
        });

        adRequest = new AdRequest.Builder().addTestDevice(DEVICE_ID_MOTO_G).addTestDevice(DEVICE_ID_ZTE).build();
        adView.loadAd(adRequest);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.fragment_snippet, container, false);
    }

    @Override
    public void onPause()
    {
        if (adView != null)
        {
            adView.pause();
        }

        super.onPause();
    }

    @Override
    public void onResume()
    {
        super.onResume();

        if (adView != null)
        {
            adView.resume();
        }

    }

    @Override
    public void onDestroy()
    {
        destroyAdView();

        super.onDestroy();
    }

    private void destroyAdView()
    {
        if (adView != null)
        {
            adRequest = null;
            adView.removeAllViews();
            adView.setAdListener(null);
            adView.destroy();
            snippetContent.removeView(adView);

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

Android AdView 泄漏,可能是由于某些内部后台线程造成的 的相关文章

  • ViewFlipper中的VideoView在播放视频时是透明的

    我有一个 Activity 在 ViewFlipper 中设置了两个视图 其中一个视图是带有 GLSurfaceView 和一些其他小部件的布局 另一个视图只有带有 TextView 和 VideoView 的布局 当我单击 GLSurfa
  • 使用busybox在后台安装apk

    我可以在 root 设备上使用 busybox 在后台安装 apk 吗 我看到类似的东西 但它不起作用 process install CommandCapture command new CommandCapture 0 chmod 77
  • 在Java中测试服务器是否启动的正确方法?

    简单地查看是否可以建立与网站 服务器的连接的正确方法是什么 我想要这个用于我正在编码的应用程序 如果我的网站离线 它只会提醒我 Thanks 您可以使用 HttpURLConnection 发送请求并检查响应正文中是否有该页面特有的文本 而
  • 对话框片段嵌入取决于设备

    在我的应用程序中 用户从联系人或通话记录中选择电话号码 选择联系人非常简单 并且在手机和平 板电脑上都可以很好地工作 i e 在手机上会弹出新的全屏活动 在桌子上我会看到带有联系人列表的漂亮弹出对话框 似乎无法从通话记录中选择电话号码 因此
  • 使用Picasso从url保存图像?

    我正在尝试使用 API Picasso 保存图像 为了做到这一点 我正在尝试使用Target保存 但我无法完成这项工作 我怎么能这样做呢 Trying save image public static void imageDownload
  • 如何在Android中访问现有的sqlite数据库?

    到目前为止 我们已经在 Android 中开发了在运行时创建数据库的应用程序 我们想知道如何在 Android 应用程序中访问预构建或现有的数据库 sqlite 文件 请提供详细信息 查看文档android database sqlite
  • org.apache.http.conn.HttpHostConnectException:在 android 中连接到 http://localhost 被拒绝

    我正在制作一个应用程序 在执行它时将图像上传到服务器并将其数据库更新到android中的服务器 它显示错误 Connection to http localhost refused 还有更多错误 我研究了这个问题 发现不是提供 URL 连接
  • 如何在 Android Studio 中构建项目测试目录?

    目前还没有这方面的约定 但是现在我如何构建 Android Studio 的测试目录呢 Android 测试基础 http developer android com tools testing testing android html页面
  • 动态地将textView添加到线性布局中

    我在这里的某个地方读过这篇文章 但我完全迷失了 但我需要一些帮助 我的应用程序正在将列名称从 sqlite 拉入数组中 我想创建一个文本视图并为每个视图编辑文本 通过数组的大小 我记得在某处读过 您可以将 textViews 变量名称视为数
  • PhoneGap Cordova Admob 插件无法正常工作

    我正在使用这个 AdMob 插件 https github com rajpara11 phonegap plugins tree master Android AdMobPlugin https github com rajpara11
  • Android 媒体播放器搜索栏

    我有一个创建 播放和处理媒体播放器 只是音频 的服务 但我在主要活动中有一个搜索栏 我想自然地显示音频文件的进度并允许用户搜索到不同的位置 我花了很长时间才弄清楚 将 UI 中的搜索栏连接到服务中的媒体播放器的最佳或正确方法是什么 我将这样
  • 调整 SwipeRefreshLayout 高度,将 View 置于其底部

    I have SwipeRefreshLayout里面一个RelativeLayout 问题是SwipeRefreshLayout占据了屏幕上的所有位置 我需要放置一个视图after这个观点 看图片 https i stack imgur
  • Android 10 请求 ACTIVITY_RECOGNITION 权限

    我试图遵守 Google 的要求 为 Android 10 请求 ACTIVITY RECOGNITION 权限 但我似乎不明白为什么没有显示权限弹出窗口 就像其他权限 即位置 存储等 一样 我的代码是 if ContextCompat c
  • 通知操作而不启动新活动?

    我计划提供一个包含两个操作的提醒通知 一个用于批准登录请求 一个用于拒绝登录请求 通过单击这些操作中的任何一个 我希望向我的服务器发出 HTTP 请求 最重要的是 我不想启动新的 Activity 或根本不想将用户重定向到我的应用程序 Co
  • 如何从一个活动检索 Double 值到另一活动?

    我制作了一个包含 2 个活动的应用程序 其中第一个活动包含一些 EditText 十进制数字 另一个活动也包含一些 EditText 十进制 现在我想将一个 EditText 的值传递给另一个 但作为 双 而不是作为一个字符串 因为该值将用
  • 如何从图库动态卸载图像?

    我有自定义 ImageView public class ShadowedImageView extends ImageView private Paint mPaint public Bitmap bitmap null private
  • android 中的 java.net.URL ..新手问题

    我是java新手 正在尝试android开发 以下代码生成 malformedURLException 有人可以帮助我识别异常吗 任何提示都会非常有帮助 package com example helloandroid import and
  • 如何减少 Android 中浮动 editText 提示和 editText 框之间的空间?

    我有一个带有浮动提示的 EditText 但我想知道如何减少浮动提示和 EditText 框之间的空间 现在我的用户界面看起来像https i stack imgur com ltfra jpg https i stack imgur co
  • Android 版本低于 Lollipop 时出现 java.lang.NoClassDefFoundError

    我有一台运行 Android 21 的 Nexus 5 设备 我正在测试我的项目 没有任何问题 但是 如果我使用 Google API 19 在模拟器上进行测试 则会显示错误java lang NoClassDefFoundError 如果
  • Android Google 地图无法在当前主题中找到样式“mapViewStyle”

    添加谷歌地图视图时 我扩展了MapView 使用xml编辑器将其添加到活动中 并将我的谷歌地图api密钥手动添加到布局xml文件中 我的权限在清单文件中允许互联网 我想知道的是 在 xml 编辑器中 我收到错误 无法在当前主题中找到样式 m

随机推荐

  • 如何从 C# 显示文件属性对话框安全选项卡

    这个帖子 如何从 C 显示文件的 属性 对话框 https stackoverflow com questions 1936682 how do i display a files properties dialog from c描述了如何
  • 如何在 Angular 中使用 *ngFor 设置 formControlNames?

    我正在尝试使用设置表单控件 ngFor数组中的对象 根据用户的不同 有时我的数组中会有 1 个对象 但有时会有多个对象 我的问题是我想创建一个formControlName使用我可以但不确定如何在组件中设置表单组验证器的循环 只需像下面这样
  • 如何通过抽象活动记录向子类添加范围

    我想要一些子类 它们都应该有一个范围 同名 尽管我知道直接继承不可能做到这一点 但基本思想如下 class MySuperClass lt lt ActiveRecord Base abstract class true scope sco
  • 如何将文件添加到以前的提交?

    在过去的一个小时左右我修改了文件 A ATest B BTest 为了确保我的提交消息与实际更改一致 已提交A并附有说明 不幸的是我没有包括在内ATest进入该提交 与此同时 尚未承诺的是B and BTest 此时最好的方法是什么 我想要
  • 为什么这条线没有被覆盖? Xcode 代码覆盖率

    我在 Xcode 中的代码覆盖率报告中遇到问题 从这个截图中你可以看到 在左侧选项卡上 第 58 行从断点 触及 在右侧选项卡上 测试通过 在右侧选项卡上 我仅运行第 37 行的测试 为什么 Xcode 将第 58 行标记为红色 因为未覆盖
  • Xcode C++ omp.h 文件未找到

    我正在尝试将 openmp 包含到我的 Xcode C 项目中 我已将 Xcode 中的编译器更改为 LLVM GCC 4 2 添加 fopenmp 作为 CFlag 并在 xcode 中启用了 OpenMP 支持 但它仍然显示 omp h
  • 最大活动数量!

    是否有关于应用程序可以拥有的活动数量的设计指南 如果有限制 那么可以在 Android 应用程序中捆绑的理想活动数量是多少 IMO 没有这样的限制 典型的应用程序将有
  • 如何检查一个对象是否具有属性?

    如何检查一个对象是否具有某些属性 例如 gt gt gt a SomeClass gt gt gt a property Traceback most recent call last File
  • SEO 和在 url 中使用 !#

    我在某处读到过如何创建一个网站 该网站使用 AJAX 加载页面的每个部分 同时仍然提供 SEO 这与 url 中使用 有关 类似于推特的做法 我似乎在任何地方都找不到任何有关它的信息 有人知道我在说什么吗 Is this http goog
  • 使用 Microsoft Teams 的 REST API 访问用户状态

    我想查询我自己和其他用户在 Teams 中的状态 理想情况下 我希望在它们发生变化时收到通知 以便我可以更改我的内部状态 目前图形 API 似乎没有此功能 不幸的是 这尚不可用 我们确实计划将其添加到 Microsoft Graph 但我们
  • 是否有一个 Java 库可以收集 UI 使用情况统计信息?

    是否有一个 Java 库可以收集 UI 使用情况统计信息 感觉像 log4j 的东西吗 如果您正在使用 Eclipse 平台 您可能会查看使用数据收集器项目 http www eclipse org epp usagedata http w
  • Magento 发票 Excel 导出 - 如何更改字段?

    我想将一些发票导出到 Microsoft Excel XML 标准格式效果不太好 因为我需要一些额外的列 我的问题是 文件在哪里生成 我在哪里设置这些特殊列 提前致谢 导出到 Excel 时执行InvoiceController calls
  • 如何确定平衡或完全平衡的二叉搜索树(仅从图片中)

    我不知道如何确定一棵树是否平衡 完全平衡 或者如果我将它作为图片而不是代码来确定它是否平衡 例如 如果我有这棵树 如何检查它是平衡 完美平衡还是不平衡 有人能给我一个完美平衡树的例子吗 o b p d m r 显然 如果是这样的话 我可以判
  • catch forEach 最后一次迭代

    arr 1 2 3 arr forEach function i last iteration 如何捕获循环结束的时间 我可以if i 3 但我可能不知道我的数组的编号是多少 另请参阅ES6 的更新答案 https stackoverflo
  • Outlook 超链接上下文菜单

    我正在尝试为超链接制作上下文菜单 似乎有几个上下文可以拦截超链接事件 目前我对 idMso ContextMenuReadOnlyMailHyperlink 的上下文菜单感兴趣 有两种不同的方式可以执行此菜单中新按钮的回调 如果在 Outl
  • 如何给用户添加角色?

    我们使用 Yii2 框架的最后一个 alpha 版 用户的角色已经创建 但问题是如何分配给用户 缺少文档 对于 RBAC 的数据库版本 请使用 DbManager 引用自 Alexufo use yii rbac DbManager r n
  • 使用 vagrant、docker 和 git 进行项目布局

    所以我最近发现了 docker 和 vagrant 并且我正在启动一个新的 Php 项目 我想在其中使用两者 Vagrant 是为了拥有一个所有开发人员都可以使用的可互换环境 Docker 用于生产 但也在 vagrant 机器内部 因此开
  • docker-compose 中的 Hyperledger 浏览器无法与 Hyperledger 区块链配合使用

    我正在尝试让 hyperledger explorer 与 docker compose 一起使用 hyperledger 区块链浏览器没有连接到 hyperledger 区块链网络 它显示 无法连接客户端对等点 请检查配置和对等点状态 不
  • Neo4j 还支持 XA 事务吗?

    我的项目使用 spring boot 和 neo4j SDN spring data neo4j 作为数据访问层 最近我遇到一个问题 我需要跨存储持久化 我需要更新neo4j和oracle数据库中的数据 因此 执行此操作的标准方法是 XA
  • Android AdView 泄漏,可能是由于某些内部后台线程造成的

    我在由片段创建的窗口中显示 AdMob 广告横幅 这有效 但我遇到了奇怪的泄漏问题 我还不明白 当我多次打开和关闭应用程序时 广告片段每次都会被正确销毁 但控制该片段的 MainActivity 正在泄漏 有罪的是代码中的这一行 adReq