1. 概述与分析

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

2. 设计思路

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

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

2: 定义三种状态

3: 定义一个当前状态

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

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

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

3. 代码实现

原理上面已经分析清楚了,下面我们就将原理用代码来实现:

/**
* author:salmonzhang
* Description:UI切换框架* Date:2017/8/6 0018 10:05*/public abstract class LoadPager extends FrameLayout {private View mLoadingView;
private View mSuccessView;
private View mErrorView;public LoadPager(@NonNull Context context) {this(context, null);
}public LoadPager(@NonNull Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);
}public LoadPager(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {super(context, attrs, defStyleAttr);init();
}//初始化UI框架三个界面
private void init() {//正在加载界面if (mLoadingView == null) {//此处正在加载界面的布局需要手动加入mLoadingView = View.inflate(getContext(), R.layout.page_loading, null);}//加载成功界面if (mSuccessView == null) {//成功的布局谁用谁传mSuccessView = createSuccessView();if (mSuccessView == null) {throw new RuntimeException("亲,请添加一个布局");}}//加载失败的界面if (mErrorView == null) {//此处加载失败界面的布局需要手动加入mErrorView = View.inflate(getContext(), R.layout.page_error, null);}//将三个布局添加在一起addView(mLoadingView);addView(mSuccessView);addView(mErrorView);//页面切换的方法changeView();//根据网络数据,自动切换页面autoShowPager();}//自动切换页面
private void autoShowPager() {new Thread(new Runnable() {@Overridepublic void run() {//获取网络数据Object obj = getNetData();//校验数据,根据返回状态自动切换状态mCurrentState = checkData(obj);//主线程去修改界面(注:这里我调用的是我工具类中的runOnUIThread方法)Utils.runOnUIThread(new Runnable() {@Overridepublic void run() {changeView();}});}}).start();
}//校验数据
private STATE checkData(Object obj) {if (obj == null) {//如果数据为空,则失败return STATE.ERROR;} else {if (obj instanceof List) {//如果返回的是数组List list = (List) obj;if (list.size() > 0) {return STATE.SUCCESS;} else {return STATE.ERROR;}} else {//如果是对象return STATE.SUCCESS;}}
}//页面切换方法
private void changeView() {//先将三个页面都隐藏mLoadingView.setVisibility(GONE);mSuccessView.setVisibility(GONE);mErrorView.setVisibility(GONE);//根据当前状态切换switch (mCurrentState) {case LOADING:mLoadingView.setVisibility(VISIBLE);break;case SUCCESS:mSuccessView.setVisibility(VISIBLE);break;case ERROR:mErrorView.setVisibility(VISIBLE);break;}
}//定义三个状态
public enum STATE {LOADING,//正在加载中SUCCESS,//加载成功ERROR;//加载失败
}//定义一个当前状态(默认正在加载中)
private STATE mCurrentState = STATE.LOADING;//创建一个加载成功的界面
public abstract View createSuccessView();//请求网络数据
public abstract Object getNetData();
}

4. UI框架的使用

在开发中我们一般都会定义一个BaseFragment,当涉及到网络请求数据时,此时就可以在onCreateView方法中使用UI自动切换框架来加载布局。示例代码如下:

public abstract class BaseFragment extends Fragment {
public LoadPager mLoadPager;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {//使用UI自动切换框架加载页面if (mLoadPager == null) {mLoadPager = new LoadPager(getContext()) {@Overridepublic Object getNetData() {return questData();}@Overridepublic View createSuccessView() {return createItemView();}};}return mLoadPager;
}//子类创建布局
public abstract View createItemView();//子类实现数据请求
public abstract Object questData();
}

好了,上面就是网络请求UI自动切换框架的分析、实现和使用。希望对你有所帮助,不足之处,望指正,多谢!

网络请求UI自动切换框架相关推荐

  1. JS基础之网络请求失败自动重试

    当我们在进行网络请求的时候,有时候由于信号不好等因素导致网络请求失败,这时我们通常就直接返回了,这不够优雅,更好的处理方式时能进行自动重试. 假设我们的网络请求代码如下: // 伪代码 functio ...

  2. android okgo 网络请求框架

    OkGo - OkHttpUtils-2.0.0升级后改名 OkGo,全新完美支持RxJava 项目地址:https://github.com/jeasonlzy,欢迎star,欢迎issue 该库是 ...

  3. java http 异步请求框架_GitHub - huangdali/MyHttpUtils: 一个非常好用的异步网络请求框架...

    轻量级网络请求框架MyHttputils 一.前言 本版代码大换血,使用了策略模式和构造模式来组织代码,增加了更加人性化的请求构造,代码质量提高.效率显著提升.(但是使用风格基本没变哦) 2.0.2版 ...

  4. ios开发循环网络请求_谈谈 iOS 网络层设计(SSJNetWork封装缓冲,log日志,自动取消网络请求)...

    2.delegate效率高,delegate只是保存了一个对象指针3.在多个通信事件的时候,delegate显得直观也易维护. delegate缺点:1.因方法的声明和实现分离开来,代码的连贯性不是很 ...

  5. 网络请求 - 收藏集 - 掘金

    Retrofit+RxJava 简单封装 - Android - 掘金 本文对Retrofit+RxJava的使用进行简单封装,简化使用. 请求结果统一封装成HttpResult类,并利用泛型对不通结 ...

  6. http请求过程 Android,android HTTP网络请求回顾

    1.HTTP协议了解 http是一种应用层的协议,底层通过TCP来进行可靠的数据传输.HTTP是基于TCP的应用层协议,它在更高的层次封装了TCP的使用细节,使网络请求更加易用,TCP连接是因特网基于 ...

  7. axios发送网络请求

    网络模块封装 选择什么网络模块 传统的Ajax 缺点:配置和调用方式等非常混乱 jQuery-Ajax 缺点:在Vue整个开发中都是不需要使用jQuery的 axios axios 功能特点: 在浏览 ...

  8. xamarin android网络请求总结

    xamarin android中网络请求的框架非常多,在项目中使用的是第三方的一个网络请求框架restsharp,应该是github上.net网络请求最多star的框架,没有之一.这里就简单汇总了其他 ...

  9. Rextrofit中网络请求空字段传递或过滤

    写在前面:前几天做项目用到retrofit来做网络请求,接触这个框架也没多久,就按照网站上的路子走,毕竟农村来的,网上的一些套路-–!,然后就掉坑里了-(ps:我们后台接口需要的参数只能少传递不能多传 ...

最新文章

  1. escape()、encodeURI()、encodeURIComponent()区别详解
  2. html中小于和大于怎么判断,html – CSS nth-child大于和小于
  3. ASP.NET MVC分页实现
  4. 存储过程打印超过8000的VARCHAR字符的问题
  5. ListView隐藏右侧滚动条,listview去掉分割线,自定义分割线,ListView添加HeaderView和FooterView
  6. js 加总数组中某一列_js根据对象数组中某一属性值,合并相同项,并对某一属性累加处理...
  7. (八)Hibernate的一对多关联关系
  8. mysql基础知识(二)
  9. linux内核奇遇记之md源代码解读之四
  10. DSGE模型的Stata实现简介
  11. netmeeting的使用(详解)
  12. 全国省市区三级数据库sql
  13. “决策树”——数据挖掘、数据分析
  14. 威尔科克森(Wilcoxon)符号秩检验:定义,运行方式
  15. Java MD5加密工具
  16. 电商代运营是做什么的
  17. 自从玩了我自己创造的这个c++游戏后,总感觉一分钟好长(火龙征战V1.0.1)
  18. miniui 消息框(MessageBox)总结
  19. Bugly SDK 集成使用
  20. PHP计算两个日期相差的天数方法详解

热门文章

  1. 一比特控制所有:通过一比特绕过Windows 10保护
  2. 最多包含2/k个不同字符的最长串
  3. RESTful API版本控制策略
  4. 使用WPF动画编程的几点注意事项[转]
  5. PHP生成静态HTML的源代码及用法
  6. iptables如何添加容许某个端口的访问
  7. Storm中的LocalState 代码解析
  8. tensorflow中的交叉熵损失
  9. sklearn:auc、roc_curve、roc_auc_score
  10. java 面向对象的特性 抽象_java面向对象的四个特性