fragment不断切换app崩溃的解决办法

简介: fragment不断切换app崩溃的解决办法

fragment是大家项目都会用到的,一般都是用来做选项卡的切换,切换时候每次都要进行网络请求,可是切换太快的话,网络请求还没完成就到下一个fragment了,这里记录一下使用fragment出现的错误以及解决办法。


错误信息1:

07-29 10:11:40.009: ERROR/AndroidRuntime(643): Caused by: java.lang.NullPointerException
07-29 10:11:40.009: ERROR/AndroidRuntime(643):     at android.view.LayoutInflater.from(LayoutInflater.java:171)
07-29 10:11:40.009: ERROR/AndroidRuntime(643):     at com.liumeng.adapter.MyListAdapter.< init >(MyListAdapter.java:23)


解决办法:


1、在onCreatView里面执行初始化操作


2、context使用之前判空


3、当出现这个问题时,只要在Fragment 中声明一个上下文类型的成员变量,并在onAttach()方法中将getActivity()的值赋给变量,在Fragment中使用到getActivity()时,都是用context即可。也就是说在将Fragment挂载到Activity时,就获得到了这个activity,并将这个activity保存起来了,这样就可以直接使用而不需要每次使用时都调用一遍getActivity()了。


4、MainActivity重写onSaveInstanceState方法,将super.onSaveInstanceState(outState);注释掉,让其不再保存Fragment的状态,达到其随着MainActivity一起被回收的效果!


错误信息2:  

20161208161113660.png


解决办法:

是在使用FragmentTransition的 commit方法添加一个Fragment的时候出现的,后来在官网找到了相关的


说明:

http://developer.Android.com/reference/android/app/FragmentTransaction.html#commitAllowingStateLoss()

public abstract int commitAllowingStateLoss () Added in API level 11 Like commit() but allows the commit to be executed after an activity’s state is saved. This is dangerous because the commit can be lost if the activity needs to later be restored from its state, so this should only be used for cases where it is okay for the UI state to change unexpectedly on the user.


 大致意思是说我使用的 commit方法是在Activity的onSaveInstanceState()之后调用的,这样会出错,因为onSaveInstanceState


方法是在该Activity即将被销毁前调用,来保存Activity数据的,如果在保存玩状态后再给它添加Fragment就会出错。解决办法就


是把commit()方法替换成 commitAllowingStateLoss()就行了,其效果是一样的。


错误信息3:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState


在使用Fragment保存参数的时候,可能是因为需要保存的参数比较大或者比较多,这种情况下也会引起异####常。比如代码

Bundle b = new Bundle();  
b.putParcelable("bitmap", bitmap2);  
imageRecognitionFragment.setArguments(b);  


设置好参数,并且添加hide(),add(),方法之后,需要commit(),来实现两个Fragment跳转的时候,这种情形下参数需要进行系统保存,但是这个时候你已经实现了跳转,系统参数却没有保存。此时就会报如上错误。


解决办法:


 你并不需要系统保存的参数,只要你自己设置的参数能够传递过去,在另外一个Fragment里能够顺利接受就行了,现在android里提供了另外一种形式的提交方式commitAllowingStateLoss(),从名字上就能看出,这种提交是允许状态值丢失的。到此问题得到完美解决,值的传递是你自己控制的。


这里也说一下另外一个问题,bitmap 也可以通过Bundle传递的,使用putParacelable就可以了


错误信息4:

java.lang.IllegalStateException: Fragment already added异常的处理。


当快速双击调用FragmentTransaction.add()方法添加fragmentA,而fragmentA不是每次单独生成的,就会引起这个异常。


DialogFragment.show()内部调用了FragmentTransaction.add()方法,所以调用DialogFragment.show()方法时候也可能会出现这个异常。


解决办法:

在add()方法时候,先判断fragmentA.isAdded(),如下调用可以避免该异常:

if(!fragmentA.isAdded()){
FragmentManager manager = ((FragmentActivity)context).getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
ft.add(fragmentA, "fragment_name");
ft.commit();
}



错误信息5:

Java.lang.IllegalStateException: fragment already active

最近遇到这个问题,fragment里有listview跳转到item的fragment页面时,setArguments传递一个Bundle参数。但是在连续点击item时,报出这个异常。


Java.lang.IllegalStateException: fragment already active

其实这个异常在源码里已经解释的非常清楚。


/** 
* Supply the construction arguments for this fragment. This can only 
* be called before the fragment has been attached to its activity; that 
* is, you should call it immediately after constructing the fragment. The 
* arguments supplied here will be retained across fragment destroy and 
* creation. 
*/

也就是说,setArguments这个方法只能在fragment和activity绑定之前调用,而且其贯穿fragment的整个生命周期。


而我的问题在于,第一次点击item的时候,fragment已经setArguments后和activity进行了绑定,只是页面反应慢而已。而第二次点击,fragment已经和activity进行了绑定。自然fragment already active了。


有了问题,就要解决。查了下度娘谷哥好像不少人遇到这个问题。


方案一

就是利用getter,setter的方式来解决。这也是网上大多数的解决方法。


方案二

这个异常是fragment already active,我们可以想到可以判断fragment的active状态来控制是否和activity绑定。

public final boolean isVisible()
Return true if the fragment is currently visible to the user. This means it: (1) has been added, (2) has its view attached to the window, and (3) is not hidden.

所以,我最后是这么解决的

 if (!baseFragment.isVisible()) {
            Bundle bundle = new Bundle();
            bundle.putString("params", str);
            baseFragment.setArguments(bundle);
            fx = fm.beginTransaction();
            fx.add(R.id.main_fl, baseFragment, "BillList");
            fx.addToBackStack(null);
            fx.commit();
        }

欢迎start,欢迎评论,欢迎指正

相关文章
|
5月前
|
消息中间件 Android开发 开发者
🔍深度剖析Android内存泄漏,让你的App远离崩溃边缘,稳如老狗!🐶
【7月更文挑战第28天】在 Android 开发中,内存管理至关重要。内存泄漏可悄无声息地累积,最终导致应用崩溃或性能下滑。它通常由不正确地持有 Activity 或 Fragment 的引用引起。常见原因包括静态变量持有组件引用、非静态内部类误用、Handler 使用不当、资源未关闭及集合对象未清理。使用 Android Studio Profiler 和 LeakCanary 可检测泄漏,修复方法涉及使用弱引用、改用静态内部类、妥善管理 Handler 和及时释放资源。良好的内存管理是保证应用稳定性的基石。
100 4
|
4月前
|
Java Windows
【Azure 应用服务】App Service 部署txt静态文件和Jar包在不同目录中的解决办法
【Azure 应用服务】App Service 部署txt静态文件和Jar包在不同目录中的解决办法
|
4月前
|
SQL 网络协议 数据库连接
【Azure 应用服务】遇见“无法创建hybrid connection for App Service”的解决办法
【Azure 应用服务】遇见“无法创建hybrid connection for App Service”的解决办法
|
7月前
|
Shell 开发工具 git
(亲测好用)构建React-app应用时create-react-app卡住超慢的解决办法
(亲测好用)构建React-app应用时create-react-app卡住超慢的解决办法
1024 0
(亲测好用)构建React-app应用时create-react-app卡住超慢的解决办法
|
7月前
|
XML Java Android开发
Android Studio App开发之碎片Fragment的讲解及实战(附源码 包括静态和动态注册)
Android Studio App开发之碎片Fragment的讲解及实战(附源码 包括静态和动态注册)
407 1
|
开发者
关于Win11系统PC连上WiFi后能正常使用各大App,但浏览器无法正常上网访问之详细解决办法
我个人近期遇到了一个问题,正如标题所说“关于Win11系统PC连上WiFi后能正常使用各大App,但浏览器无法正常上网访问”,这个bug困扰过不少开发者,今天来简单分享一下解决办法
1530 1
|
XML 数据格式
web.xml中的web-app中配置信息顺序出错解决办法
web.xml中的web-app中配置信息顺序出错解决办法
132 0
|
移动开发 iOS开发
h5的header在iOS app内不显示,在浏览器显示正常解决办法
h5的header在iOS app内不显示,在浏览器显示正常解决办法
129 0
|
移动开发 安全 JavaScript
关于ios低版本在app store下载软件时由于版本低导致不能下载的解决办法
关于ios低版本在app store下载软件时由于版本低导致不能下载的解决办法
598 0
关于ios低版本在app store下载软件时由于版本低导致不能下载的解决办法
|
XML Android开发 数据格式
Android Navigation + Fragment 制作APP主页面导航(步骤 + 源码)
Android Navigation + Fragment 制作APP主页面导航(步骤 + 源码)
414 0
Android Navigation + Fragment 制作APP主页面导航(步骤 + 源码)

热门文章

最新文章