网络请求UI自动切换框架

  
1。概述与分析
  

在实际项目中,我们不可避免的需要网络请求数据,由于网络或请求方式等主观或客观原因,导致我们请求的结果有时会出现一些偏差,从而导致我们UI界面显示也会有所不同,一般情况下,网络请求后我们的界面一般呈现三种页面状态:“正在加载中”,“加载失败”和“加载成功”。那么就可以通过网络请求后结果让UI界面自动切换,

  
2。设计思路h5> 通常情况下,正在加载和加载失败的界面都是相同的,只有加载成功后的界面不同。为了能让UI界面随着网络请求结果自动切换,那我们可以按照如下思路去设计:

  
  

1:将三种状态的界面叠加在一起

  

2:定义三种状态

  

3:定义一个当前状态

  

4:定义一个根据当前状态来切换界面的方法

  

5:定义一个根据网络请求返回结果自动切换界面的方法

     

综上分析,我们可以得出如下框架原理图:

  

网络请求UI自动切换框架

  
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自动切换框架