18842388900

网站建设 APP开发 小程序

Article/文章

记录成长点滴 分享您我感悟

您当前位置>首页 > 知识 > 网站建设

延迟加载片段

当我们进行应用程序开发时,Activity可以将viewpager(或其他容器)与多个Fragment结合使用,如果每个片段需要加载数据,在本地加载,或从网络加载,那么当这个活动只是创建后,有必要初始化大量资源。当然,我们不会对这个结果感到满意。那么,切换到这个片段时可以初始化吗?

答案在Fragment的setUserVisibleHint方法中。请在Fragment中查看此方法的API文档(国内图片地址:http://zdz.la/YrpKlu):

[普通]视图plaincopySetahinttothesystemaboutwhetherthisfragment'sUIiscurrentlyvisibletotheuser.Thishintdefaultstotrueandispersistentacrossfragmentinstancestatesaveandrestore.Anappmaysetthistofalsetoindicatethatthefragment'sUIisscrolledoutofvisibilityorisotherwisenotdirectlyvisibletotheuser.Thismaybeusedbythesystemtoprioritizeoperationssuchasfragmentlifecycleupdatesorloaderorderingbehavior.ParametersisVisibleToUsertrueifthisfragment'sUIiscurrentlyvisibletotheuser(默认值),falseifitisnot。

此方法用于告知系统此片段的UI是否可见。因此我们只需要继承Fragment并重写该方法,以便在片段可见时执行数据加载操作,即片段的延迟加载。

代码如下:

[java] view plaincopy/** Date: 14-7-17 * Project: Access-Control-V2 */packagecn.irains.access_control_v2.common; importandroid.support.v4.app.Fragment;/***作者: msdx (645079761@qq.com)*时间: 14-7-17 PM 5: 46 */publicabstractclassLazyFragmentextendsFragment {protectedbooleanisVisible;/***在此处实现片段数据的缓慢加载。* @ paramisVisibleToUser */@ OverridepublicvoidsetUserVisibleHint(booleanisVisibleToUser){super。 setUserVisibleHint(isVisibleToUser);如果(getUserVisibleHint()){ISVISIBLE=TRUE; onVisible();}其他{ISVISIBLE=FALSE; onInvisible();}} protectedvoidonVisible(){lazyLoad();} protectedabstractvoidlazyLoad(); protectedvoidonInvisible() 在LazyFragment中,我添加了三个方法,一个是onVisiable,当fragment设置为visible时调用,一个是onInvisible,当fragment设置为不可见时调用。还写了一个lazyLoad的抽象方法,在onVisible中调用。您可能会想,为什么不直接在getUserVisibleHint中调用它?

我写这个代码重用。因为在片段中,我们还需要创建一个视图(onCreateView()方法),并且当它不可见时可能需要执行其他小的初始化操作(例如初始化需要通过AIDL调用的远程服务)。在onCreateView之前调用setUserVisibleHint,然后在未初始化视图时,如果在lazyLoad中使用,则会出现空指针异常。通过将lazyLoad拉入方法,其子类可以执行此操作:

[java] view plaincopypublicclassOpenResultFragmentextendsLazyFragment {//flag,该标志已初始化。 privateBooleanisPrepared; @OverridepublicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState){Log.d(LOG_TAG,'onCreateView'); Viewview=inflater.inflate(R.layout.fragment_open_result,container,false); //XXX初始化视图控件isPrepared=True ; lazyLoad(); returnview;} @ OverrideprotectedvoidlazyLoad(){if(!isPrepared ||!isVisible){return;} //填写每个控件的数据}}

在上面的类中,我们添加了一个标志isPrepared来指示初始化是否完成。然后,在我们需要的初始化操作完成之后,如上例所示,在初始化视图之后,将isPrepared设置为true并调用lazyLoad()方法。在lazyLoad()中,确定只要一个不为真,就不会执行isPrepared和isVisible。也就是说,只有在初始化完成并且可见时才继续加载,这避免了由于使用未初始化而引起的问题。

这里我介绍片段延迟加载的实现。如果您感兴趣,可以基于此进一步探索它,例如编写具有缓慢初始化和可见刷新的片段。

标签:& nbsp& nbspapp开发和应用程序设计& nbspFragment延迟加载

网站建设,小程序开发,小程序制作,微信小程序开发,公众号开发,微信公众号开发,网页设计,网站优化,网站排名,网站设计,微信小程序设计,小程序定制,微信小程序定制

相关案例查看更多