Android 那些年,处理getActivity()为null的日子

   在日常开发中的时候,我们经常会使用ViewPager+Fragment进行视图滑动,在某些部分逻辑也许我们需要利用上下文Context(例如基本的Toast),但是由于Fragment只是衣服在Activity容器的一个试图,如果需要拿到当前的Activity的上下文Context就必须通过getActivity()获取。

   然而,不知道各位程序猿有没有遇过出现getActivity()出现null的时候导致程序报出空指针异常。其实原因可以归结于因为我们在
(一)切换fragment的时候,会频繁被crash
(二)系统内存不足
(三)横竖屏幕切换的时候
....
   以上情况都会导致Activity被系统回收,但是由于fragment的生命周期不会随着Actiivty被回收而被回收,因此才会导致getActivity()出现null的问题。

解决

这里总结三个解决方法:

(一)建立Context引用
   首先我们看下Fragment的生命周期:


fragment 生命周期.jpg

   在Fragment的生命周期中,在生命周期处于onAttach()和onDetach()之间的时候getActivity()方法才不会返回null。因此我们可以在fragment初始化的时候建立Context引用。在fragment销毁的时候销毁引用。代码如下:

    @Overridepublic void onAttach(Activity activity) {super.onAttach(activity);mCtx = activity;//mCtx 是成员变量,上下文引用
    }@Overridepublic void onDetach() {super.onDetach();mCtx = null;}

(二)合理利用getapplicationcontext()
   在方法1中使用临时变量存储Context上下文引用能够一定程度解决问题。由于在Android中,Application、Service、Activity都拥有上下文,getapplicationcontext()可以获取全局的上下文,所以只要程序不关闭,获取的context很难为null~

(三)自定义自己的application
   第三种方法其实与第二种方法基本原理相同,即将自定义的application中,临时存储application拥有的上下文Context。在程序中,通过单利访问application的时候获取该上下文Context。具体使用如下:

(1)在配置清单注册自己的application

<applicationandroid:name=".MyApplication"android:icon="@drawable/ic_launcher"android:label="@string/app_name" >

(2)在Application中的onCreate存储上下文,并且创建单利。

public class MyApplication extends Application {private static MyApplication instance;@Overridepublic void onCreate() {super.onCreate();instance = this;//存储引用
    }public static MyApplication getInstance(){return instance;}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式状态模式uml_UML的完整形式是什么?

设计模式状态模式umlUML&#xff1a;统一建模语言 (UML: Unified Modeling Language) UML is an abbreviation of Unified Modeling Language. In the field of software engineering, it is a visual modeling language that is standard in quality. It makes it available t…

vqa mcb_MCB的完整形式是什么?

vqa mcbMCB&#xff1a;微型断路器 (MCB: Miniature Circuit Breaker) MCB is an abbreviation of "Miniature Circuit Breaker". MCB是“微型断路器”的缩写 。 It is an automatically operated electronics switch. It is designed to detect the fault in the e…

CentOS忘记普通用户密码解决办法

普通用户忘记密码 1.使用root用户登录系统&#xff0c;找到/etc/shadow文件。 2.找到用户名开头的那一行&#xff0c;例如我的用户名为pds,&#xff0c;以冒号为分割符&#xff0c;红色部分是密码加密部分 pds:$1$CivopRgF$ajWQ54W1XJbifFjm05Jk/1:15353:0:99999:7::: 3.pds是我…

esp32的GPIO操作

对于任何一款芯片&#xff0c;GPIO接口是其最基本的组成部分&#xff0c;也是一款芯片入门的最基本操作&#xff0c;下面论述下 关于esp32开发版的GPIO操作&#xff0c;本文中重点讲解下 关于如何创建eclipse工程&#xff0c;并通过eclipse下载到esp32中去&#xff08;本文的工…

聚焦数据的力量——全球领先安全技术分享会在京召开

ZD至顶网安全频道 04月21日 综合消息&#xff1a; 由中国网络安全与信息化产业联盟、360共同主办的“数据的力量——全球领先安全技术分享会“今日在北京成功召开。来自政府、企业、教育、投资机构和产业联盟的300多位嘉宾参加了本次技术分享会&#xff0c;共同就安全产业发展趋…

如何设置Fedora默认从命令行启动?

2019独角兽企业重金招聘Python工程师标准>>> Sumary:因为在Fedora中没有/etc/initab文件我们不方便从这里设置它的runlevel target&#xff0c;但是Linux又给我们提供了一个强悍的工具systemd,我们可以用system来链接默认的启动级别&#xff0c;所以开始吧&#xff…

工控领域的网络攻击 食尸鬼行动深入解读Operation Ghoul

卡巴斯基于2016年6月监测到了Operation Ghoul&#xff08;食尸鬼行动&#xff09;网络攻击&#xff0c;Operation Ghoul针对30多个国家的工业、制造业和工程管理机构发起了定向渗透入侵。目前&#xff0c;卡巴斯基发现&#xff0c;有130多个机构已被确认为这类攻击的受害者。 该…

tomcat:sessionId生成机制导致tomcat启动过慢问题

为什么80%的码农都做不了架构师&#xff1f;>>> http://blog.csdn.net/u013939884/article/details/72860358 转载于:https://my.oschina.net/wii01/blog/1527731

Codeforces Round #431 (Div. 2)

A. Odds and Endstime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputWhere do odds begin, and where do they end? Where does hope emerge, and will they ever break? Given an integer sequence a1, a2, ..., a…

ping/pong模式_PING的完整形式是什么?

ping/pong模式PING&#xff1a;数据包InterNet Groper (PING: Packet InterNet Groper) In the sector of networking of computers, PING is an abbreviation of Packet InterNet Groper. It is utility software or system software of administration of computer network u…

Gartner: 2017年11大信息安全技术(解读版)

在2017年6月份举办的第23届Gartner安全与风险管理峰会上&#xff0c;Gartner的Fellow——Neil McDonald发布了2017年度的11个最新最酷的信息安全技术&#xff0c;比往年的10大技术多了一项。以往都是通过互联网了解Gartner的各种信息和报告。这次&#xff0c;本人有幸亲临现场&…

博客url什么形式_URL的完整形式是什么?

博客url什么形式URL&#xff1a;统一资源定位符 (URL: Uniform Resource Locator) URL is an abbreviation of Uniform Resource Locator. Uniform Resource Locator which is informally or casually known as a web address is addressed as a resource of the web, which ca…

宝马奥迪工厂模式_宝马的完整形式是什么?

宝马奥迪工厂模式宝马&#xff1a;巴伐利亚汽车公司 (BMW: Bayerische Motoren Werke) BMW is an abbreviation of "Bayerische Motoren Werke". It is a multinational automobile and motorcycle manufacturing company whose headquarter is situated in Munich, …

艾拉物联CEO :物联网时代的到来让安全问题显得尤为突出

产品安全和嵌入式安全的理念一直都很复杂&#xff0c;不过我们至少对它们比较熟悉。但物联网&#xff08;IoT&#xff09;却对“产品”这一理念进行了颠覆&#xff0c;让联网成为了产品定义中不可或缺的一部分。 由此一来&#xff0c;仅在设备层面讨论安全已经远远不够了。不论…

jquery选择器连续选择_JQuery中的选择器

jquery选择器连续选择Its time to write some JQuery now. Do check out the introductory article on JQuery first in case you havent. Before we move to Selectors in JQuery, lets talk a bit about the general syntax first. 现在该写一些JQuery了。 如果没有&#xff…

split注意事项

为什么80%的码农都做不了架构师&#xff1f;>>> 1.特殊字符 “|”&#xff0c;“*”&#xff0c;“^”&#xff0c;"."&#xff0c;“&#xff1a;”&#xff0c;使用此字符作为分割符&#xff0c;必须用\\加以转义 2.同时存在多个特殊字符的时候&#x…

Floyd Warshall算法

Description: 描述&#xff1a; This is a very popular interview problem to find all pair shortest paths in any graph. This problem has been featured in interview rounds of Samsung. 这是一个非常流行的面试问题&#xff0c;用于在任何图中找到所有对最短路径。 该…

Java多线程系列--“基础篇”09之 interrupt()和线程终止方式

2019独角兽企业重金招聘Python工程师标准>>> Java多线程系列--“基础篇”09之 interrupt()和线程终止方式 概要 本章&#xff0c;会对线程的interrupt()中断和终止方式进行介绍。涉及到的内容包括&#xff1a;1. interrupt()说明2. 终止线程的方式 2.1 终止处于“阻…

mac活动监视器_什么是活动监视器?

mac活动监视器活动监控 (Activity Monitor) Apple OS X provides the services of which one of them is Activity Monitor. Activity Monitor is used to monitor the activities of computer like active processes, processor load, applications that are running, and the…

concurrent包下的Exchanger练习

Exchanger可以在两个线程之间交换数据&#xff0c;只能是2个线程&#xff0c;他不支持更多的线程之间互换数据。 当线程A调用Exchange对象的exchange()方法后&#xff0c;他会陷入阻塞状态&#xff0c;直到线程B也调用了exchange()方法&#xff0c;然后以线程安全的方式交换数据…