网络请求UI自动切换框架
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自动切换框架相关推荐
- JS基础之网络请求失败自动重试
当我们在进行网络请求的时候,有时候由于信号不好等因素导致网络请求失败,这时我们通常就直接返回了,这不够优雅,更好的处理方式时能进行自动重试. 假设我们的网络请求代码如下: // 伪代码 functio ...
- android okgo 网络请求框架
OkGo - OkHttpUtils-2.0.0升级后改名 OkGo,全新完美支持RxJava 项目地址:https://github.com/jeasonlzy,欢迎star,欢迎issue 该库是 ...
- java http 异步请求框架_GitHub - huangdali/MyHttpUtils: 一个非常好用的异步网络请求框架...
轻量级网络请求框架MyHttputils 一.前言 本版代码大换血,使用了策略模式和构造模式来组织代码,增加了更加人性化的请求构造,代码质量提高.效率显著提升.(但是使用风格基本没变哦) 2.0.2版 ...
- ios开发循环网络请求_谈谈 iOS 网络层设计(SSJNetWork封装缓冲,log日志,自动取消网络请求)...
2.delegate效率高,delegate只是保存了一个对象指针3.在多个通信事件的时候,delegate显得直观也易维护. delegate缺点:1.因方法的声明和实现分离开来,代码的连贯性不是很 ...
- 网络请求 - 收藏集 - 掘金
Retrofit+RxJava 简单封装 - Android - 掘金 本文对Retrofit+RxJava的使用进行简单封装,简化使用. 请求结果统一封装成HttpResult类,并利用泛型对不通结 ...
- http请求过程 Android,android HTTP网络请求回顾
1.HTTP协议了解 http是一种应用层的协议,底层通过TCP来进行可靠的数据传输.HTTP是基于TCP的应用层协议,它在更高的层次封装了TCP的使用细节,使网络请求更加易用,TCP连接是因特网基于 ...
- axios发送网络请求
网络模块封装 选择什么网络模块 传统的Ajax 缺点:配置和调用方式等非常混乱 jQuery-Ajax 缺点:在Vue整个开发中都是不需要使用jQuery的 axios axios 功能特点: 在浏览 ...
- xamarin android网络请求总结
xamarin android中网络请求的框架非常多,在项目中使用的是第三方的一个网络请求框架restsharp,应该是github上.net网络请求最多star的框架,没有之一.这里就简单汇总了其他 ...
- Rextrofit中网络请求空字段传递或过滤
写在前面:前几天做项目用到retrofit来做网络请求,接触这个框架也没多久,就按照网站上的路子走,毕竟农村来的,网上的一些套路-–!,然后就掉坑里了-(ps:我们后台接口需要的参数只能少传递不能多传 ...
最新文章
- escape()、encodeURI()、encodeURIComponent()区别详解
- html中小于和大于怎么判断,html – CSS nth-child大于和小于
- ASP.NET MVC分页实现
- 存储过程打印超过8000的VARCHAR字符的问题
- ListView隐藏右侧滚动条,listview去掉分割线,自定义分割线,ListView添加HeaderView和FooterView
- js 加总数组中某一列_js根据对象数组中某一属性值,合并相同项,并对某一属性累加处理...
- (八)Hibernate的一对多关联关系
- mysql基础知识(二)
- linux内核奇遇记之md源代码解读之四
- DSGE模型的Stata实现简介
- netmeeting的使用(详解)
- 全国省市区三级数据库sql
- “决策树”——数据挖掘、数据分析
- 威尔科克森(Wilcoxon)符号秩检验:定义,运行方式
- Java MD5加密工具
- 电商代运营是做什么的
- 自从玩了我自己创造的这个c++游戏后,总感觉一分钟好长(火龙征战V1.0.1)
- miniui 消息框(MessageBox)总结
- Bugly SDK 集成使用
- PHP计算两个日期相差的天数方法详解