Android: Fragment中getActivity()返回null的问题
2015-10-18 22:21
441 查看
一、getActivity()返回null
在一个项目中使用了ViewPager+Fragment的组合,但是在实际使用中频繁的Crash。排查后发现,我在Fragment内有一些AsyncTask联网操作,在网络链接失败的时候会弹出Toast消息提示。而生成Toast时传入的Context参数是getActivity(),该函数返回null,于是就抛出了NullPointException:
Toast.makeText(getActivity(), "Some Message", Toast.LENGTH_LONG).show();
查阅一下Fragment的生命周期:
在Fragment的生命周期中,
onAttach()和
onDetach()之间
getActivity()函数才会返回正确的对象,否则的话返回null。
因此,如果我正在做某些操作联网,在等待过程中点击Back键返回,使得这个Fragment被销毁了,这时Fragment就会和Activity解除附着(onDetach),当再试图弹出Toast的时候,
getActivity()返回null,于是就Crash了。
二、保存Context引用
明白了问题出在哪就好解决了,常用的方法是在Fragment附着在Activity上时用一个变量保存引用,即:@Override public void onAttach(Activity activity){ this.mContext = activity; }
三、使用全局Application来得到Context
在每个Fragment内都用一个变量保存Context的引用确实可以满足需求,但是代码冗余了不少,更一劳永逸的办法就是使用全局Application来得到Context。Android程序中Application、Service和Activity都实现了Context,但只有Application才能保证在程序运行期间一直存在并且具有唯一性,因此在程序中可以使用Application来获得Context而不用担心空指针。
首先在manifest文件中注册Application
<application android:name=".MyApplication" android:icon="@drawable/ic_launcher" android:label="@string/app_name" >
然后创建MyApplication.java,我们在这里使用单例模式来对外保持Application的引用
public class MyApplication extends Application { private static MyApplication instance; @Override public void onCreate() { super.onCreate(); instance = this; } public static MyApplication getInstance(){ // 这里不用判断instance是否为空 return instance; } }
这样在程序的任何地方都可以使用Application来得到Context了。
Context context = MyApplication.getInstance(); Toast.makeText(context, "Your Toast Message", Toast.SHORT_TOAST).show();
参考
[1]Android Fragment 生命周期
[2]
Android应用程序的Activity启动过程简要介绍
本文首发http://www.dss886.com,转载请注明
相关文章推荐
- Android应用开发系列(二)登陆界面
- 仿QQ圆头像裁剪开源项目——ClipCircleHeadLikeQQ
- Android目录
- android.view.WindowLeaked解决办法
- Android TextView 文字多时加省略号
- Android M Permission处理
- Android程序适应多种分辨率
- android 46 service
- android 45 通知
- CheckBox 多选按钮的使用方法
- Android:Task '' not found in root project '*****'
- Android SQLite 使用总结
- android animation
- android clipPath切割画布
- Android:Material Design兼容库(Design Support Library)
- android popupWindow
- Android Slqite 有无索引测试
- android 44 SQLiteOpenHelper
- [转]Android之Activity的几种跳转方式
- android-自定义ImageView-圆形图片绘制代码详解