网络请求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() {
        @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
@Override
public 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自动切换框架的分析、实现和使用。希望对你有所帮助,不足之处,望指正,多谢!

原文地址:https://blog.51cto.com/14347056/2398859

时间: 2024-10-11 15:57:51

网络请求UI自动切换框架的相关文章

android网络请求与页面切换

在android开发中会遇到使用fragment切换页面,并且切换的页面都会有网络请求,网络请求成功后会更新相应的fragment页面.如果使用异步网络请求组件android-async-http,会出现这样的情况,当你快速的切换fragment时,每个fragment都会发出新的请求.例如:fragmentA发了网络请求,又切换到了fragmentB,fragmentB又发了网络请求,然后快速的切换两个fragment,切换多次后可能会出现,fragmentA发出的请求返回成功并且使用hand

OkHttpUtils一个专注于让网络请求更简单的框架

1.支持的常用功能 一般的 get,post,put,delete,head,options请求 基于Post的大文本数据上传,postString(),postJson()等 多文件和多参数统一的表单上传(允许监听上传进度) 支持一个key上传一个文件,也可以一个Key上传多个文件 大文件下载和下载进度回调 大文件上传和上传进度回调 支持cookie的内存存储和持久化存储,支持传递自定义cookie 提供网络缓存功能,默认支持304缓存协议,并额外扩展了三种本地缓存模式 支持301.302重定

iOS 网络请求Json自动转存到CoreData(二)

项目需求:从网络获取Json后,将Json自动转存到CoreData中. 继上一篇日志,那么这篇的主要内容是:将Json存到CoreData中. 说话实话,无非就是KVC赋值,思路清晰明了,但是我在想一个问题,有没有办法做到通用呢?那么问题来了-挖机技术哪家强! 好了不扯淡了,虽然KVC暂时满足我项目需求,那个通用办法我还在寻找中,能力有限,不过我会努力. 顺便分享一篇 讲述 这个网络请求数据存放到CoreData的介绍 Process remote service data into Core

iOS 网络请求Json自动转存到CoreData(一)

奉上地址一枚:GitHub 并自带demo- 项目需求:从网络获取Json后,将Json自动转存到CoreData中. 本次任务:对CoreData封装,完成基本的增删改查,多线程操作. 我们总是在跌跌撞撞中,不断成长. CoreDataActivity.h // //  CoreDataActivity.h //  QGLCoreDataPlugin // //  Created by Guicai.Li on 14-10-16. //  Copyright (c) 2014年 Guicai 

Android网络请求框架AsyncHttpClient实例详解(配合JSON解析调用接口)

最近做项目要求使用到网络,想来想去选择了AsyncHttpClient框架开进行APP开发.在这里把我工作期间遇到的问题以及对AsyncHttpClient的使用经验做出相应总结,希望能对您的学习有所帮助. 首先按照惯例先来简单了解一些AsyncHttpClient网络框架的一些知识. 1.简介 Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用android-a

各大网络请求框架的比较

原文:http://www.cnblogs.com/changyaohua/p/4992987.html 自己学习android也有一段时间了,在实际开发中,频繁的接触网络请求,而网络请求的方式很多,最常见的那么几个也就那么几个.本篇文章对常见的网络请求库进行一个总结. HttpUrlConnection 最开始学android的时候用的网络请求是HttpUrlConnection,当时很多东西还不知道,但是在android 2.2及以下版本中HttpUrlConnection存在着一些bug,

XDroidRequest网络请求框架,新开源

XDroidRequest 是一款网络请求框架,它的功能也许会适合你.这是本项目的第三版了,前两版由于扩展性问题一直不满意,思考来 思考去还是觉得Google的Volley的扩展性最强,于是借鉴了Volley的责任链模式,所以有了这个第三版. Provide 1 适配 Android 6.0 ,不再使用HttpClient相关API 2 一行代码发送请求,提供多种回调函数供选择, 3 支持8种网络请求方式 GET,POST,PUT,DELETE,HEAD,OPTIONS,TRACE,PATCH

iOS网络请求框架:MKNetWorkKit的使用

MKNetWorkKit是由一个印度小伙子写的,是用于网络请求的库,支持ARC,我fork了一下,代码的网址这里给出. 本人fork作者代码地址(DoubleYi):https://github.com/DoubleYi/MKNetworkKit 作者源码地址(MugunthKumar):https://github.com/MugunthKumar/MKNetworkKit 作者关于类库介绍的地址(MugunthKumar):http://blog.mugunthkumar.com/produ

Android之封装好的异步网络请求框架

1.简介 Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnection,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用这个MyHttpUtils库可以大大的简化操作,它是基于HttpURLConnection,所有的请求都是独立在UI主线程之外,没有通过CommCallback回调方法处理请求结果, 没有了子线程.没有了handle,链式的变成使得代码更加清晰 . 2.特性 支持get.post请求,文件下载,上传