当前位置: 首页 > news >正文

Fragment中获取Activity的一点点建议

平时的Android开发中,我们经常要在Fragment中去获取当前的Activity实例,刚开始的时候可能使用使用Fragment提供的getActivity方法来获取,但是这个方法可能返回null,为了让程序可以正常运行,项目中就出现大量下面这样的代码:

FragmentActivity activity = getActivity();
if(activity == null){return;
}
//use activity

FragmentActivity activity = getActivity();
if(activity != null){//use activity
}

这个代码是安全的,但是多次编写就显得繁琐且可能出错(因为我觉得再简单的事只要重复非常多遍,出错的可能性就增加)。

本文分场景分别介绍几种优化的方式。

Activity一定存在的场合

首先是比较简单的Activity一定存在的场合,比如Fragment的onResumeonCreateDialog等方法中,这里Activity不可能为空,那么如果还要加if语句来检查Activity为空的情况,就显得很多余。这种情况下我们就可以利用requireActivity方法,这个方法的内部实现检查Activity不存在的时候会抛出异常,如果返回,一定不为空,这样就不需要再对返回值做检查:

FragmentActivity activity = requireActivity();
//use activity

Activity可能不存在的场合

Activity可能不存在的场合就分很多种,比如Fragment中另起线程、Presenter对Fragment的调用、其他组件比如播放器的回调等等,这种情况下一遍遍地去编写getActivity结果的检测,是一件很无聊的事情,但这个又是一件必要的事情,因为如果不做就会导致程序崩溃。因此,下面提出一种将这个过程简化的方法。

首先,自己项目中应该有类似BaseFragmentBaseDialogFragment这样的基础Fragment,我们要做的就是在这些类里添加一个optActivity方法,实现如下:

public Optional<FragmentActivity> optActivity() {return Optional.ofNullable(getActivity());
}

这样在各个Fragment子类中就可以直接使用optActivity来更加简洁地获取Activity实例:

optActivity().ifPresent(activity -> {//do something
});

看上去和原来的代码量差不多,但只要写一遍就能体会出来,这种新的写法要素更少,更不容易出错,写起来也更快,而且在有时候可以写得更简洁、更突出重点:

button.setOnClickListener(v -> optActivity().ifPresent(activity -> {//do something   
}));

这里的重点在于按钮点击后的处理,检查Activity是否存在没那么重要。

相关文章:

Fragment中获取Activity的一点点建议

平时的Android开发中&#xff0c;我们经常要在Fragment中去获取当前的Activity实例&#xff0c;刚开始的时候可能使用使用Fragment提供的getActivity方法来获取&#xff0c;但是这个方法可能返回null&#xff0c;为了让程序可以正常运行&#xff0c;项目中就出现大量下面这样的…...

Java Math类

Java Math 类是 Java 标准库中提供的一个数学计算类&#xff0c;它提供了很多数学函数&#xff0c;如三角函数、指数函数、对数函数等。在实际工作中&#xff0c;Java Math 类常常被用于处理数学计算问题&#xff0c;例如计算复杂的数学公式、实现数学算法等。本文将详细介绍 J…...

Javascript -- 加载时间线 正则表达式

js加载时间线 1、创建Document对象&#xff0c;开始解析web页面&#xff0c;解析html元素和他们的文本内容后添加Element对象和Text节点到文档中。这个阶段的document.readyState ‘loading’ 2、遇到link外部css&#xff0c;创建线程加载&#xff0c;并继续解析文档 3、遇到…...

gdb/git的基本使用

热爱编程的你&#xff0c;一定经常徘徊在写bug和改bug之间&#xff0c;调试器也一定是你随影而行的伙伴&#xff0c;离开了它你应该会寝食难安吧&#xff01; 目录 gdb的使用 断点操作 运行调试 观察数据 Git的使用 仓库的创建和拉取 .gitignore “三板斧” 常用指令 gd…...

信息安全与数学基础-笔记-④二次同余方程

知识目录二次同余方程的解欧拉判别式Legendre (勒让德符号)二次同余方程的解 什么是二次同余方程的解 注意这里二次同余方程和一次同余方程是不一样的 在x2x^2x2 三 a (mod m) 方程中举例 ↓ 解即剩余类&#xff0c;因为是模m&#xff0c;所以我们在 [ 0, m-1 ]中逐个代入看是…...

Luogu P4447 [AHOI2018初中组]分组

题目链接&#xff1a;传送门 将nnn个可重复的整数分为mmm组&#xff0c;每组中的数必须连续且不重复&#xff0c;使人数最少的组人数最多。 两个最值肯定第一想到二分&#xff0c;每次二分出一个值&#xff0c;判断在这个值为答案的前提下能否完成分组。 在思考判别函数时发现…...

手把手创建flask项目

Flask 框架流程 什么是Flask&#xff1a; Flask诞生于2010年, 使用python语言基于Werkzeug工具箱编写的轻量级Web开发框架 Flask本身相当于一个内核, 其他几乎所有的功能都要用到扩展(邮件:Flask-Mail, 用户认证:Flask-Login, 数据库:Flask-SQLAlchemy). Flask的核心在于Werkz…...

SpringCloud-4_Eureka服务注册与发现

Eureka作为一个老牌经典的服务注册&发现技术&#xff0c;其设计和理念&#xff0c;也在影响后面的组件。目前主流的服务注册&发现的组件是Nacos当前项目架构问题分析-引出Eureka问题分析&#xff1a;1.在企业级项目中&#xff0c;服务消费访问请求会存在高并发2.如果只…...

【react全家桶】生命周期

文章目录04 【生命周期】1.简介2.初始化阶段2.1 constructor2.2 componentWillMount&#xff08;即将废弃&#xff09;2.3 static getDerivedStateFromProps&#xff08;新钩子&#xff09;2.4 render2.5 componentDidMount2.6 初始化阶段总结3.更新阶段3.1 componentWillRecei…...

虚拟机安装Windows 10

虚拟机安装Windows 10 镜像下载 方法一&#xff1a;下载我制作好的镜像文件->百度网盘链接 提取码&#xff1a;Chen 方法二&#xff1a;自己做一个 进入微软官网链接 下载"MediaCreationTool20H2" 运行该工具 点击下一步选择路径&#xff0c;等他下载好就欧克了…...

【CMU15-445数据库】bustub Project #2:B+ Tree(下)

Project 2 最后一篇&#xff0c;讲解 B 树并发控制的实现。说实话一开始博主以为这块内容不会很难&#xff08;毕竟有 Project 1 一把大锁摆烂秒过的历史x&#xff09;&#xff0c;但实现起来才发现不用一把大锁真的极其痛苦&#xff0c;折腾了一周多才弄完。 本文分基础版算法…...

leetcode 困难 —— 外星文字典(拓扑排序)

题目&#xff1a; 现有一种使用英语字母的外星文语言&#xff0c;这门语言的字母顺序与英语顺序不同。 给定一个字符串列表 words &#xff0c;作为这门语言的词典&#xff0c;words 中的字符串已经 按这门新语言的字母顺序进行了排序 。 请你根据该词典还原出此语言中已知的字…...

ubuntu server 18.04使用tensorflow进行ddqn训练全过程

0. 前言 需要使用ddqn完成某项任务&#xff0c;为了快速训练&#xff0c;使用带有GPU的服务器进行训练。记录下整个过程&#xff0c;以及遇到的坑。 1. 选择模板代码 参考代码来源 GitHub 该代码最后一次更新是Mar 24, 2020。 环境配置&#xff1a; python3.8 运行安装脚本…...

2023年全国最新二级建造师精选真题及答案14

百分百题库提供二级建造师考试试题、二建考试预测题、二级建造师考试真题、二建证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 二、多选题 61.已经取得下列资质的设计单位&#xff0c;可以直接申请相应类别施工总承包一级…...

mysql一条语句的写入原理

mysql写入原理 我们知道在mysql数据库最核心的大脑就是执行引擎&#xff1b; 其中的默认引擎Innodb在可靠执行和性能中做出来平衡&#xff1b; innodb支持在事务控制、读写效率&#xff0c;多用户并发&#xff0c;索引搜索方面都表现不俗&#xff1b; innodb如何进行数据写入…...

嵌入式Linux内核代码风格(二)

第九章&#xff1a;你已经把事情弄糟了 这没什么&#xff0c;我们都是这样。可能你的使用了很长时间Unix的朋友已经告诉你“GNU emacs”能 自动帮你格式化C源代码&#xff0c;而且你也注意到了&#xff0c;确实是这样&#xff0c;不过它所使用的默认值和我们 想要的相去甚远&a…...

Spring Boot @Aspect 切面编程实现访问请求日志记录

aop切面编程想必大家都不陌生了&#xff0c;aspect可以很方便开发人员对请求指定拦截层&#xff0c;一般是根据条件切入到controller控制层&#xff0c;做一些鉴权、分析注解、获取类名方法名参数、记录操作日志等。 在SpringBoot中使用aop首先是要导入依赖如下&#xff1a; …...

初学者的第一个Linux驱动

软件环境&#xff1a;Ubuntu20.04 Linux内核源码&#xff1a;3.4.39 硬件环境&#xff1a;GEC6818 什么是驱动&#xff1f;简单来说就是让硬件工作起来的程序代码。 Linux驱动模块加载有两种方式&#xff1a; 1、把写好的驱动代码直接编译进内核。 2、把写好的驱动代码编…...

7. 拼数

1 题目描述 拼数成绩10开启时间2021年09月24日 星期五 18:00折扣0.8折扣时间2021年11月15日 星期一 00:00允许迟交否关闭时间2021年11月23日 星期二 00:00 设有 n个正整数 a[1]​…a[n]​&#xff0c;将它们联接成一排&#xff0c;相邻数字首尾相接&#xff0c;组成一个最大的整…...

Java每天15道面试题 | Redis

redis 和 和 memcached 什么区别&#xff1f;为什么高并发下有时单线程的 redis 比多线程的memcached 效率要高&#xff1f; 区别&#xff1a; 1.mc 可缓存图片和视频。rd 支持除 k/v 更多的数据结构; 2.rd 可以使用虚拟内存&#xff0c;rd 可持久化和 aof 灾难恢复&#xff0…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...