在片段中使用上下文的最佳方式

2023-12-31

我在我的应用程序中使用片段。我创建了一个名为 BaseFragment 的父类,所有其他片段都扩展了此 Basefrgment,下面是此 Basefragment 的片段

基础片段.java

public class BaseFragment extends Fragment {
    public MainActivity activity;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (activity == null && context instanceof  MainActivity) {
            activity = (MainActivity) context;
        }
    }
}


public void replaceFragment(Fragment fragment, FragmentDetail last) {

    fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    boolean push = true;
    if (Validator.isNotNull(last)) {
        push = false;
    }
    /*if(Validator.isNull(last)){
        transaction.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right);
    }else{
        transaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left);
    }*/
    transaction.add(R.id.frame_container, fragment, fragment.getClass().getName());
    if (Validator.isNull(last) && preferences.getFragmentStack().size() > 0) {
        last = preferences.getFragmentStack().lastElement();
    }
    if (Validator.isNotNull(last)) {
        Fragment f = fragmentManager.findFragmentByTag(last.className);
        if (Validator.isNotNull(f)) {
            f.onPause();
            transaction.remove(f);
        }
    }
    last = new FragmentDetail(fragment.getClass().getName(), getTitle().toString(), preferences.isBack());
    if (preferences.isBack() || preferences.getFragmentStack().size() == 0) {
        if (push) {
            preferences.getFragmentStack().push(last);
        }
    } else {
        while (preferences.getFragmentStack().size() > 1) {
            preferences.getFragmentStack().pop();
        }
        if (!preferences.getFragmentStack().lastElement().className.equals(last.className)) {
            preferences.getFragmentStack().push(last);
        }
    }
    transaction.commitAllowingStateLoss();
    changeNavigationIcon();

// HWUtil.showToast(this,fragmentManager.getBackStackEntryCount() + ""); }

在所有其他片段中,我使用活动作为上下文,我的问题是,以这种方式访问​​上下文是否是不好的方法,或者它是否会造成内存泄漏。或任何其他访问上下文的方法。任何帮助都适用。


我认为你存储的方式context确实是最佳选择,因为您将能够在每个子片段实例中使用它。因为MainActivity是片段中的实例变量,当片段被销毁时它将被垃圾收集。如果我对 Activity-Fragment 生命周期没有误解,那么当您的 Activity 轮换时,将创建新的片段,而旧的片段实例将被销毁。所以,我们在那里也很好。但是,您需要小心上下文变量声明:

public MainActivity activity;

这使得它可以从任何地方访问。任何类都可以调用类似的东西context = fragIns.activity并将其保存在那里。这对你来说真的很糟糕,因为现在它保存了对该上下文变量的引用。现在,当不再需要您的片段时,它不会被垃圾收集,因为其他一些类正在保存对其变量之一的引用。你会发现自己身处“内存泄漏之城”。

确保您密切关注该变量,并且它的引用不会传递给其他类。由于它位于超类中,因此您可以将其定义为:

protected MainActivity activity;

这应该可以完成工作。

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

在片段中使用上下文的最佳方式 的相关文章

随机推荐

  • ipywidgets 小部件值未更改

    我正在尝试从在 Python 3 6 中运行 Jupyter Notebooks 的 Microsoft Azure Notebooks 中的 ipywidgets 小部件获取输出 但是 当我获取新值时 它不会返回新值 这也适用于从未被其他
  • PhoneGap IOS 应用程序大小

    我使用 eclipse 和 xcode 4 5 创建了适用于 android 和 IOS 的phonegap 应用程序 Android应用程序大小为650KB iOS应用程序的大小是9MB 我创建了空的phonegap应用程序 刚刚在终端上
  • 位运算与

    这是一个leetcode问题 给定一个数字数组 nums 其中恰好有两个元素仅出现一次 而所有其他元素恰好出现两次 找出只出现一次的两个元素 例如 给定 nums 1 2 1 3 2 5 返回 3 5 我的代码是 class Solutio
  • 使用bash,如何删除特定目录中所有文件的扩展名?

    我想保留这些文件但删除它们的扩展名 这些文件的扩展名不同 我的最终目标是删除它们的所有扩展并将它们更改为我选择的一个扩展 我已经把第二部分写下来了 到目前为止我的代码 bin bash echo n Enter the directory
  • 寻找在过程中保持大小并清除旧元素的数据结构

    Usecase维护最后 n 个访问过的 URL 的列表 其中 n 是固定数字 当新的 URL 添加到列表中时 旧的 URL 会自动删除 以使其保持在 n 个元素 要求数据结构需要按时间排序 如果接受 Comparator 应该没问题 你需要
  • 如何遍历 N 叉树

    我的树 节点类 import java util ArrayList import java util List public class Node
  • 如果未安装应用程序,则重定向到应用程序商店

    场景是用户将获得他的电子邮件的链接 如果用户单击链接 如果应用程序已安装 则应用程序应打开 如果应用程序未安装 则应重定向到应用程序商店 我已经看到了深度链接的实现 但我相信它也需要在后端进行更多的实现 任何人都可以帮忙解决这个问题吗 如果
  • 如何在 Webpack 中使用 Tree Shaking?

    我刚刚使用 Angular 2 版本 rc 2 应用程序 使用 Typescript 更新到 webpack 2 1 0 beta 15 但我想知道如何使用树摇动功能 我读到它应该 开箱即用 但我仍然有一个 1 7Mb 的捆绑包用于一个非常
  • 我在哪里可以下载 Facebook 的 PHP 源代码转换器 HipHop [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 在哪里可以下载 PHP 版 HipH
  • 是否可以列出数据库中的所有外键?

    如何列出 sql server 数据库中的所有 F 我使用这个语句 看起来效果很好 SELECT RC CONSTRAINT NAME FK Name KF TABLE SCHEMA FK Schema KF TABLE NAME FK T
  • 带有电子邮件域的 AutoCompleteTextView android

    所以我的应用程序中有一个自动完成文本视图字段 我希望用户输入他的电子邮件地址 现在 为了帮助他更快地打字并且不犯错误 我想在打字时向他建议最常见的电子邮件域服务器 我将该控件与该数组一起使用 String arraymails gmail
  • 如何更改选项卡主机的默认颜色

    我使用的是2 2 SDK版本 我使用 TabHost 以选项卡视图格式显示活动 当我在手机中安装应用程序 版本2 2 1 时 选项卡主机颜色已更改为黄色 即使我也不给 TabHost 任何颜色 我不知道为什么颜色改变了 当我在模拟器中运行相
  • Android WebView UTF-8 不显示

    我有一个 webview 并尝试将简单的 UTF 8 文本加载到其中 mWebView loadData 將賦予他們的傳教工作標示為 text html UTF 8 但 WebView 显示 ANSI ASCII 垃圾 显然是编码问题 但是
  • Django 开发服务器重新加载时间太长

    自从我升级到 OSX Lion 以来 这一直是我的问题 每当我更改 Django 项目中的文件时 运行服务器重新加载 需要相当长的时间才能再次开始服务 即使在新创建的 Django 1 4 项目中也会发生这种情况 不过在 Snow Leop
  • 如何在 Python 2.7 中创建计时器?

    我目前正在使用 Pyglet 库编写一个打砖块克隆程序 我想制作一个计时器 为游戏的 奖励 即更长的桨 更快的桨移动 更大的球 计时长达 20 秒 我一直在尽我所能地在互联网上挖掘 但找不到答案 import threading bonus
  • 使用 Rails 中的表单批量更新对象

    我有一个人物模型和一个报价模型 每个人都可以有许多与其相关的引言 而这些引言又可以与作者 文本 网址等内容相关联 实际上 实际上只有一个人拥有引用对象 但所有人都可能拥有一个 我正在尝试在报价上使用一个非常简单的批量适度工具 例如 用户可以
  • 使用 Python 解析 SVG 文件路径

    我正在开发一个机器人项目 从 Android 运行设备拍摄一张照片 然后发送到 cloudconvert org 将其转换为 SVG 然后所有 SVG 路径将被转换为 x y 坐标并串行发送到机器人手臂 机器人手臂将绘制它们笔打开或关闭 所
  • Fancybox 3:单击图像时禁用缩放

    我使用 Fancybox 3 插件设置了一个简单的图像滑块 http fancyapps com fancybox 3 docs http fancyapps com fancybox 3 docs 在 Kirby CMS 中 https
  • R 中 0-1 之间的所有值组合总和为 1

    简单的问题 我试图获得 3 个数字 0 1 到 0 9 之间 的权重之和为 1 的所有组合 例子 c 0 20 0 20 0 60 c 0 35 0 15 0 50 权重相差 0 05 我已经尝试过这个 library gregmisc p
  • 在片段中使用上下文的最佳方式

    我在我的应用程序中使用片段 我创建了一个名为 BaseFragment 的父类 所有其他片段都扩展了此 Basefrgment 下面是此 Basefragment 的片段 基础片段 java public class BaseFragmen