网络请求UI自动切换框架
来源:互联网 发布:顾比均线的通达信源码 编辑:程序博客网 时间:2024/05/16 18:22
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() { @Override public void run() { //获取网络数据 Object obj = getNetData(); //校验数据,根据返回状态自动切换状态 mCurrentState = checkData(obj); //主线程去修改界面(注:这里我调用的是我工具类中的runOnUIThread方法) Utils.runOnUIThread(new Runnable() { @Override public 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@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { //使用UI自动切换框架加载页面 if (mLoadPager == null) { mLoadPager = new LoadPager(getContext()) { @Override public Object getNetData() { return questData(); } @Override public View createSuccessView() { return createItemView(); } }; } return mLoadPager;}//子类创建布局public abstract View createItemView();//子类实现数据请求public abstract Object questData();}
好了,上面就是网络请求UI自动切换框架的分析、实现和使用。希望对你有所帮助,不足之处,望指正,多谢!
阅读全文
0 0
- 网络请求UI自动切换框架
- OkHttp网络请求框架+AsyncTask自动解析
- UI网络请求
- UI 网络请求
- 网络接口自动切换
- UI 网络请求协议 NSURLConnectionDataDelegate
- 网络请求框架---Volley
- ios 网络请求框架
- Volley网络请求框架
- 网络请求框架---Volley
- 网络请求框架-Volley
- Volley-----网络请求框架
- Volley网络请求框架
- 网络请求框架
- okhttp网络请求框架
- 网络请求框架
- http网络请求框架
- 网络请求框架OKHttp
- ubuntu服务器升级内核
- Ubuntu16.04系统下安装OpenCV3.2.0
- 常用SQL语句
- 迭代子模式
- hexo的next百度统计
- 网络请求UI自动切换框架
- UVa1587-Box
- 题目3:统计0~n中有多少个9
- hexo的next主题打赏
- Matlab在最优化计算中的应用
- Qt openGL 使用QImage 生成二维纹理
- hexo的next主题常用设置
- Hdu6068 Classic Quotation(2017多校第4场)
- Java学习第十八天