fragment中引用上下文导致的nullpoint
来源:互联网 发布:北京耳机实体店 知乎 编辑:程序博客网 时间:2024/06/03 21:20
一、背景
在一个项目中使用了ViewPager+Fragment的组合,但是在实际使用中频繁的Crash,错误是在Fragment内部出现的NullPointException。
经过仔细排查,发现是因为我在Fragment内有一些AsyncTask联网操作,在网络链接失败的时候会弹出Toast消息提示。而生成Toast时传入的Context参数是getActivity()
,这里就有可能会出现问题了,只有Fragment附着(onAttach)在Activity上时 getActivity()
函数才会返回正确的对象,否则的话返回null。[1]
因此,如果我正在联网,滑动ViewPager使得这个Fragment被销毁了或者点击Back键返回了,此时Fragment就会和Activity解除附着,当再试图弹出Toast的时候,getActivity()
返回null,于是就Crash了。
二、保存Context引用
明白了问题出在哪就好解决了,在Fragment附着在Activity上时用一个变量保存引用就ok了。
@Overridepublic void onAttach(Activity activity){ this.mContext = activity;}
三、内存泄漏?
这样通过在Fragment中使用全局变量保存Context引用貌似解决了这个问题,但是和狐狸(icyfox)讨论过以后,认为这种方法有可能会导致内存泄漏。当联网操作持续时间比较长,比如网络拥堵不断重试时,其附着的Activity变量会一直保存,反复开启这个Activity(实际运行中这种情况并不少见)会导致同时有很多个Activity的引用。
四、使用全局Application来得到Context
我们知道Android程序中Application、Service和Activity都实现了Context,如果保存Activity的引用作为Context有可能导致内存泄漏的话,那么是不是可以用Application或Service来得到引用?答案是可以,并且如果你不想为了引用Context专门创建一个全局Service的话,显然是Application更方便。[2]
首先在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(){ // 因为我们程序运行后,Application是首先初始化的,如果在这里不用判断instance是否为空 return instance; }}
这样在程序的任何地方都可以使用Application来得到Context,而不用担心内存泄漏了。
Context context = MyApplication.getInstance();Toast.makeText(context, "Your Toast Message", Toast.SHORT_TOAST).show();
- fragment中引用上下文导致的nullpoint
- fragment 中调用getactivity()的时候报 nullpoint错误
- fragment中使用recycleView报nullpoint错误
- Android中ViewPager + Fragment使用ButterKnife注解时出现空指针NullPoint的情况
- Fragment中关于Simpleadapter的 无指针问题 nullpoint 以及runnable问题
- Android中ViewPager + Fragment使用ButterKnife注解时出现空指针NullPoint的情况
- 不可思议的nullpoint
- Undo 操作遇到的上下文与相应 Set 操作中应用的上下文不同 是什么原因导致的?
- 在fragment中添加上下文菜单
- Android-Fragment中TextView.setFocusable(true)导致的内存泄露
- Android-Fragment中TextView.setFocusable(true)导致的内存泄露
- Fragment 中使用 SwipeRefreshLayout 导致的不能退出问题
- Fragment中多次调用onCreatView()导致异常问题的解析
- 对于Fragment支持的上下文的支持
- 通过Fragment实现简单的上下文菜单
- linux tcp 编程中头文件引用导致的惨案
- JS中引用类型导致的大困惑
- Java中static变量相互引用导致的Bug
- 设计模式之单例模式完全解析
- unity之触发碰撞器
- 一个JAVA文件可以写几个Class类?
- 数字翻转
- 如何使用正则表达式匹配邮箱
- fragment中引用上下文导致的nullpoint
- python use ftp to download/updown
- Windows命令
- 将三个数按从大到小输出
- Redis整合Spring结合使用缓存实例
- ORA-00918:未明确定义列
- Android面试一天一题(Day 26:ScrollView嵌套ListView的事件冲突)
- 动态调整TLS record size优化性能原理及实现
- Android APP测试之进行单元测试的好处