当前位置: 首页 > 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是否存在没那么重要。

http://www.lryc.cn/news/30949.html

相关文章:

  • Java Math类
  • Javascript -- 加载时间线 正则表达式
  • gdb/git的基本使用
  • 信息安全与数学基础-笔记-④二次同余方程
  • Luogu P4447 [AHOI2018初中组]分组
  • 手把手创建flask项目
  • SpringCloud-4_Eureka服务注册与发现
  • 【react全家桶】生命周期
  • 虚拟机安装Windows 10
  • 【CMU15-445数据库】bustub Project #2:B+ Tree(下)
  • leetcode 困难 —— 外星文字典(拓扑排序)
  • ubuntu server 18.04使用tensorflow进行ddqn训练全过程
  • 2023年全国最新二级建造师精选真题及答案14
  • mysql一条语句的写入原理
  • 嵌入式Linux内核代码风格(二)
  • Spring Boot @Aspect 切面编程实现访问请求日志记录
  • 初学者的第一个Linux驱动
  • 7. 拼数
  • Java每天15道面试题 | Redis
  • 13_pinctrl子系统
  • Linux系统对于实施人员的价值
  • ForkJoin 和 Stream并行流
  • 逻辑优化-cofactor
  • 车道线检测CondLaneNet论文和源码解读
  • vue3的插槽slots
  • docker学校服务器管理
  • pv和pvc
  • k8s篇之Pod 干预与 PDB
  • Django学习17 -- ManytoManyField
  • 既然有MySQL了,为什么还要有Redis?