1。概述与分析
在实际项目中,我们不可避免的需要网络请求数据,由于网络或请求方式等主观或客观原因,导致我们请求的结果有时会出现一些偏差,从而导致我们UI界面显示也会有所不同,一般情况下,网络请求后我们的界面一般呈现三种页面状态:“正在加载中”,“加载失败”和“加载成功”。那么就可以通过网络请求后结果让UI界面自动切换,
2。设计思路h5>
通常情况下,正在加载和加载失败的界面都是相同的,只有加载成功后的界面不同。为了能让UI界面随着网络请求结果自动切换,那我们可以按照如下思路去设计:
1:将三种状态的界面叠加在一起
2:定义三种状态
3:定义一个当前状态
4:定义一个根据当前状态来切换界面的方法
5:定义一个根据网络请求返回结果自动切换界面的方法
引用>综上分析,我们可以得出如下框架原理图:
3。代码实现h5>
原理上面已经分析清楚了,下面我们就将原理用代码来实现:
<代码>/* * *作者:salmonzhang *描述:UI切换框架 *日期:0018年2017/8/6 10:05 */公共抽象类LoadPager延伸FrameLayout { 私人观点mLoadingView; 私人观点mSuccessView; 私人观点mErrorView; 公共LoadPager (@NonNull上下文语境){ 这(上下文,null); } 公共LoadPager (@NonNull上下文语境,@Nullable AttributeSet attrs) { 这(上下文、attrs 0); } 公共LoadPager (@NonNull上下文语境,@Nullable AttributeSet attrs, @AttrRes int defStyleAttr) { 超级(上下文、attrs defStyleAttr); init (); }//初始化UI框架三个界面 私人空间init () {//正在加载界面 如果(mLoadingView==null) {//此处正在加载界面的布局需要手动加入 mLoadingView=View.inflate (getContext(),出来。employee, null); }//加载成功界面 如果(mSuccessView==null) {//成功的布局谁用谁传 mSuccessView=createSuccessView (); 如果(mSuccessView==null) { 把新RuntimeException(“亲,请添加一个布局”); } }//加载失败的界面 如果(mErrorView==null) {//此处加载失败界面的布局需要手动加入 mErrorView=View.inflate (getContext(),出来。page_error, null); }//将三个布局添加在一起 addView (mLoadingView); addView (mSuccessView); addView (mErrorView);//页面切换的方法 changeView ();//根据网络数据,自动切换页面 autoShowPager (); }//自动切换页面 私人空间autoShowPager () { 新线程(新Runnable () { @Override 公共空间run () {//获取网络数据 对象obj=getNetData ();//校验数据,根据返回状态自动切换状态 mCurrentState=checkData (obj);//主线程去修改界面(注:这里我调用的是我工具类中的runOnUIThread方法) Utils.runOnUIThread(新Runnable () { @Override 公共空间run () { changeView (); } }); } }) .start (); }//校验数据 私人状态checkData(对象obj) { 如果(obj==null){//如果数据为空,则失败 返回STATE.ERROR; 其他}{ 如果(obj instanceof列表){//如果返回的是数组 obj=列表列表(列表); 如果(list.size()在0){ 返回STATE.SUCCESS; 其他}{ 返回STATE.ERROR; } 其他}{//如果是对象 返回STATE.SUCCESS; } } }//页面切换方法 私人空间changeView () {//先将三个页面都隐藏 mLoadingView.setVisibility(了); mSuccessView.setVisibility(了); mErrorView.setVisibility(了);//根据当前状态切换 开关(mCurrentState) { 例加载: mLoadingView.setVisibility(可见); 打破; 成功案例: mSuccessView.setVisibility(可见); 打破; 案例的错误: mErrorView.setVisibility(可见); 打破; } }//定义三个状态 公共枚举状态{ 加载、//正在加载中 成功,//加载成功 错误;//加载失败 }//定义一个当前状态(默认正在加载中) 私人状态mCurrentState=STATE.LOADING;//创建一个加载成功的界面 公共抽象视图createSuccessView ();//请求网络数据 公共抽象对象getNetData (); }代码>4。UI框架的使用
在开发中我们一般都会定义一个BaseFragment,当涉及到网络请求数据时,此时就可以在onCreateView方法中使用UI自动切换框架来加载布局。示例代码如下:
网络请求UI自动切换框架