viewpageindicator +fragment 在网络访问中与volley框架 null问题

来源:互联网 发布:顾家北和慎小嶷 知乎 编辑:程序博客网 时间:2024/05/16 10:41

最近在写一个电子图书馆,采用的主体的框架是volley和viewpageindocator。首先想说,这两个开源框架真的很优秀。有很多帖子bolg都对他们做了很详细的描述,在此我仅仅将我做码代码过程中遇到的问题记录一下。

1.viewpage后台运行之后在activity栈还原,程序突然变得很卡。并不时报出getActivity()为null的错误。

对于这个问题,我想说的是,首先需要理解fragment的生命周期,我在这里不多说,很多帖子都有这个描述。遇到这个问题主要是因为在后台运行过程中GC回收了activity,而fragment并没有回收,而是通过onsaveinstance函数保存了临时状态,那么在恢复activity的时候,就会导致fragment和fragmentactivity之间的attach不到的问题。在此,解决办法,很多前辈都有描述,两种。

    1、不保存fragment的状态:在MyActivity中重写onSaveInstanceState方法,将super.onSaveInstanceState(outState);注释掉,让其不再保存Fragment的状态,达到fragment随MyActivity一起销毁的目的。    2、重建时清除已经保存的fragment的状态:在恢复Fragment之前把Bundle里面的fragment状态数据给清除。方法如下:        if(savedInstanceState!= null)        {            String FRAGMENTS_TAG = "android:support:fragments";            savedInstanceState.remove(FRAGMENTS_TAG);        }

2.volley网络访问获取到json数据,加载到adapter中也报getActivity为null错误。

一直以为是因为oom的问题,导致内存回收了,而导致fragmentActivity一直出现这个状态。就一直在清理缓存并对fragment各个生命周期进行观察。后面才发现并不是这个问题,真正的问题是:volley网络获取数据是异步操作,那么操作完成获取到网络返回值的时候,可能用户已经滑到别的fragment,而该fragment已经没有attatch到fragmentActivity上去了。那么这是的getActivity返回值也就理所当然的是为null了。毕竟是异步操作。

对于这种问题,参考过搜狐视频的APP,因为感觉浏览界面是差不多的。发现有一个不一样的地方,搜狐的app在切换的时候,滑动时两个相邻fragment的view是完全保证并正常运行的。这个问题等以后有时间深入探讨一下。

而我对于这个问题的解决方式很简单:通过启动程序的时候启动一个后台service,通过这个service来进行初始界面的数据获取,然后保存在缓存中,或者直接sharepreference保存到本地。当数据拉取完成之后通过广播的形势,通知到UI主线呈。如果进入viewpageindicator 之时数据还没有缓存完成,那么就显示圆形进度条进行等待操作。

0 0