在日常开发中的时候,我们经常会使用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销毁的时候销毁引用。代码如下:

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

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

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

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

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

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

public class MyApplication extends Application {

    private static MyApplication instance;

    @Override
public void onCreate() {
super.onCreate();
instance = this;//存储引用
} public static MyApplication getInstance(){
return instance;
}
}

Android 那些年,处理getActivity()为null的日子的更多相关文章

  1. Android Fragment中调用getActivity为null的问题

       在使用fragment的时候经常会遇到getActivity()为null的情况.比如我在一个异步网路请求的回调中调用了getActivity()就会出现空指针问题.之前解决这个问题,通常都是直 ...

  2. Android Fragment getActivity返回null解决

    在Android开发中,如果我们用到V4包里面的Fragment,在应用被切换到后台的时候,Activity可能被回收,但是创建的所有Fragment则会被保存到Bundle里面,下面是Fragmen ...

  3. [Android Pro] Android Fragment getActivity返回null解决

    overide FragmentActivity  onSaveInstanceState method like this. @Override public void onSaveInstance ...

  4. Android之debug---menu的getActionView()return null

    MainActivity代码 @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this a ...

  5. Android填坑系列:Android JSONObject 中对key-value为null的特殊处理

    在与服务端通过JSON格式进行交互过程中,不同版本的JSON库在对于key-value为null情况上的处理不同. Android自带的org.json对key-value都要求不能为null,对于必 ...

  6. 我的Android进阶之旅------>Handlerr.removeCallbacksAndMessages(null)的作用

    今天都到一段代码,在onDestroy()方法中,使用了下面的代码: mHandler.removeCallbacksAndMessages(null); 一开始我完全看不懂,我为什么参数是null, ...

  7. android.widget.TextView.setText() on a null object reference

    错误描述 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView. ...

  8. Visual Studio 2015中创建C#的Android项目提示"Value cannot be null"的解决方法

    由于之前本机已安装过Android SDK,在安装Visual Studio 2015时跳过了,并没有为Xamarin指定对应路径导致.Visual Studio顶部菜单:Tools > Opt ...

  9. android 下载图片出现SkImageDecoder::Factory returned null,BitmapFactory.Options压缩

    网上有很多说是因为没有采用HttpClient造成的,尼玛,我改成了HttpClient 请求图片之后还是会出现SkImageDecoder::Factory returned null, 但是直接使 ...

随机推荐

  1. PHP日期和时间处理组件-Carbon

    https://packagist.org/packages/nesbot/carbon 我们使用PHP时经常需要处理日期和时间,有时会被时间时区搞混淆,而Carbon是PHP中很人性化的时间日期处理 ...

  2. View的呈现(二)加载流程

    这块涉及到Code+Razor模板=>html[output流] 而这块的问题在于Razor最后生成了什么?--对象:一个类文件:eg:index.cshtml  => index_cst ...

  3. css元素垂直居中方法

    1.Line-height 适用情景:单行文字垂直居中技巧 这个方式应该是最多人知道的了,常见于单行文字的应用,像是按钮这一类对象,或者是下拉框.导航此类元素最常见到的方式了.此方式的原理是在于将单行 ...

  4. 给大家介绍几个常见的Android代码片段

    今天在源码天堂那个网站,也下载了一个不错的Android源码特效,现在分享一下给博客园的朋友吧,个人觉得那个网站还是挺不错的,希望大家能够使用得上. 仿美图秀秀拼图功能源码 仿美图秀秀拼图功能源码,最 ...

  5. 织梦Fatal error: Call to a member function GetInnerText()

    问题:织梦修改或者添加了自定义表单后在后台修改文章的时候出现如下错误:Fatal error: Call to a member function GetInnerText() on a non-ob ...

  6. POJ 1995 Raising Modulo Numbers 【快速幂取模】

    题目链接:http://poj.org/problem?id=1995 解题思路:用整数快速幂算法算出每一个 Ai^Bi,然后依次相加取模即可. #include<stdio.h> lon ...

  7. ZBrush与同类数字雕刻软件的比较

    随着数字雕刻软件的迅猛发展,不但在软件的数量和功能上有突飞猛进的提高,行业应用上也有很大的拓展.那么,与同类数字雕刻软件比较下,用户应该如何选择呢?下面我们来对这些软件做一个简单的罗列分析. 目前数字 ...

  8. Eclipse配置SVN的几种方法及使用详情(此文章对Myeclipse同样适用)

    一.在Eclipse里下载Subclipse插件 方法一:从Eclipse Marketplace里面下载 具体操作:打开Eclipse --> Help --> Eclipse Mark ...

  9. 路飞学城Python-Day32

    36-进程池线程池 开多线程实现并发的效率是高的,当用户没有那么多的时候,服务器是可以承受压力的 但是一定要以某种方式来设置并发数,让服务器能够实现稳定的运行,控制服务器的线程数 设置池,往里面放池的 ...

  10. Python——wordcloud

    import jiebafrom wordcloud import WordCloud,STOPWORDSimport matplotlib.pyplot as pltfrom scipy.misc ...