Android中getActivity()为null的解决办法

前言

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

然而,不知道各位程序猿有没有遇过出现getActivity()出现null的时候导致程序报出空指针异常。

其实原因可以归结于因为我们在:

(一)切换fragment的时候,会频繁被crash

(二)系统内存不足

(三)横竖屏幕切换的时候

....

以上情况都会导致Activity被系统回收,但是由于fragment的生命周期不会随着Actiivty被回收而被回收,因此才会导致getActivity()出现null的问题。

解决

这里总结三个解决方法:

(一)建立Context引用

首先我们看下Fragment的生命周期:

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中,ApplicationServiceActivity都拥有上下文,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;
 }
}

总结

这里只是我总结的几个处理方法,当然有其他开发者有更好的建议能够提出来,这样更好。大家一起技术分享,让大家共同进步!

(0)

相关推荐

  • Android getActivity()为空的问题解决办法

    Android getActivity()为空的问题解决办法 在开发项目中有时会碰到getActivity函数为空的情况,    导致apk空指针崩溃问题,  看代码逻辑没有明显的原因. 如果看Activity.Java.FragmentActivity.java的源码就可以找到原因. 当activity实例在后台时, 系统在回收资源时很可能回收掉Activity,  并在onSaveInstanceState函数里保存fragment的状态, 再次打开该Activity时, 在onCreate

  • Android中getActivity()为null的解决办法

    前言 在日常开发中的时候,我们经常会使用ViewPager+Fragment进行视图滑动,在某些部分逻辑也许我们需要利用上下文Context(例如基本的Toast),但是由于Fragment只是依附在Activity容器的一个试图,如果需要拿到当前的Activity的上下文Context就必须通过getActivity()获取. 然而,不知道各位程序猿有没有遇过出现getActivity()出现null的时候导致程序报出空指针异常. 其实原因可以归结于因为我们在: (一)切换fragment的时

  • Android中ScrollView嵌套GridView的解决办法

    前些日子在开发中用到了需要ScrollView嵌套GridView的情况,由于这两款控件都自带滚动条,当他们碰到一起的时候便会出问题,即GridView会显示不全. 找到大家的通用解决办法.记录一下. 解决办法,自定义一个GridView控件 public class MyGridView extends GridView { public MyGridView(Context context, AttributeSet attrs) { super(context, attrs); } pub

  • Android中HTTP请求中文乱码解决办法

    Android中HTTP请求中文乱码解决办法 编码参数 List<NameValuePair> formparams = new ArrayList<NameValuePair>(); // 请求参数 for (NameValuePair p : params) { formparams.add(p); } UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams,HTTP.UTF_8); // 创建POST

  • Android中EditText实现不可编辑解决办法

    android:editable is deprecated: Use an <EditText> to make it editable android:editable is deprecated: Use inputType instead 分析:关于EditText控件的read-only问题,即: 无法通过UI更改其中的内容, 但可以选定部分内容, 进行复制.在早期的sdk, EditText有Editable属性, 现在这个属性已经deprecated了.   解决方法: 其实只需

  • 深入学习Android ANR 的原理分析及解决办法

    目录 一.ANR说明和原因 1.1 简介 1.2 原因 1.3 避免 二.ANR分析办法 2.1 ANR重现 2.2 ANR分析办法一:Log 2.3 ANR分析办法二:traces.txt 2.4 ANR分析办法三:Java线程调用分析 2.5 ANR分析办法四:DDMS分析ANR问题 三.造成ANR的原因及解决办法 四.ANR源码分析 4.1 Service造成的Service Timeout 4.2 BroadcastReceiver造成的BroadcastQueue Timeout 4.

  • Android 出现问题Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER解决办法

    Android 出现问题Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER解决办法 最近做项目遇到 Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER这个报错信息,不知该如何解决,百度一下,发现有朋友同样问题并解决,这里记录下,有兴趣的朋友可以看下, Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER  [2014-0

  • Android中播放Gif动画取巧的办法

    由于做的项目,要有个动画的等待效果,第一时间想到的就是Gif(懒,省事),但是试了好多据说能播放Gif的控件,也写过,但是放到魅族手机上就是不能播放,所有就想了个招,既然Gif能在浏览器上播放,那android 的 WebView 也能播放,写了个Demo,果然能播放. 1.将gif的文件放到android的资源文件夹里面 2.写个html,将android的gif源放到WebView里面去加载 <RelativeLayout xmlns:android="http://schemas.a

  • Android Caused by: java.lang.ClassNotFoundException解决办法

    Android Caused by: java.lang.ClassNotFoundException解决办法 出现问题: 08-13 18:29:22.924: E/AndroidRuntime(1875): Caused by: Java.lang.ClassNotFoundException:XXXXX    in loader dalvik.system.PathClassLoader[/data/app/XXXX.apk] 我想大家经常因为疏忽出现ClassNotFoundExcept

  • Android安装应用 INSTALL_FAILED_DEXOPT 问题及解决办法

    今天在帮助客户解决一个问题时,由于他们的手机是用的5.0系统身边没有5.0系统的手机,只能用一个模拟器来安装测试应用,但是在安装过程中碰到了以下问题: The application could not be installed: INSTALL_FAILED_DEXOPT 清除模拟器数据 在AndroidStudio中打开AVD Manager: 使用WipeData清除数据: 调整模拟器内存 使用上面的WipeData还是一样的问题的话,建议重新编辑下模拟器的配置将Internal Stor

  • Redis中哈希分布不均匀的解决办法

    Redis 是一个键值对数据库,其键是通过哈希进行存储的.整个 Redis 可以认为是一个外层哈希,之所以称为外层哈希,是因为 Redis 内部也提供了一种哈希类型,这个可以称之为内部哈希.当我们采用哈希对象进行数据存储时,对整个 Redis 而言,就经过了两层哈希存储. 哈希对象 哈希对象本身也是一个 key-value 存储结构,底层的存储结构也可以分为两种:ziplist(压缩列表) 和 hashtable(哈希表).这两种存储结构也是通过编码来进行区分: 编码属性 描述 object e

随机推荐