高效抽取loading,再多的载入页面也不怕
当今的app基本上有两个操作,一个是载入数据 ,一个就是把数据显示到页面上。但假设页面特别的多。就每一个页面都要载入数据,就要写 loading 页面。我之前就是用dialog写,抽取出来一个类。哪里须要了就在那里加入以下代码。我发现我大多数时间都在 反复的 加入 loading代码。为此总加班。 
请无限參考此文章:http://blog.csdn.net/wanghao200906/article/details/46805085
以下是页面多的时候状态 
 
这要再多点儿 一个一个的写不但代码不好看,自己也累得慌
以下我们就来说一下怎样高效的写loading了。
一般页面有四种情况 
载入中  :就是滚动页面。后台获取载入的数据,每一个页面的数据不同所以就让子类来实现,直接抽象abstract了。
载入失败 :一般都须要点击后又一次载入 
空页面   :也须要点击后又一次载入 
载入成功 :显示成功的页面,每一个页面都不同所以让子类实现。那必须是抽象的 abstract了
我採取的是每一个页面都是framelayout来显示 载入的页面。一共同拥有四个页面。
通过载入的数据返回来的 状态 进而让页面显示对应的动画
先屡一下思路 
1   先载入三个页面,開始都执行loading页面 
2   载入数据, 用到了线程池处理耗时炒作,详细怎样訪问网络让子类来实现推断数据是否可用 
3   数据可用显示 成功界面 
    数据不可用显示 载入失败页面 
    数据的list比方为0  载入空页面 
以下直接上代码时间:
package com.example.every_text.view;
import com.wang.cn.manager.ThreadManager;
import com.wang.cn.utils.UIUtils;
import android.content.Context;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
/**
 * 先加顺序 load -->showPagerView-->createSuccessView
 *
 * @author wanghao
 *
 *在子类中 耗时操作放到 load中,然后load返回一个状态。在showPagerView中依据状态选择 显示的页面
 *假设装在是成功的。那么久显示 createSuccessView
 */
public abstract class LoadingPager extends FrameLayout {
    // 载入默认的状态
    private static final int STATE_UNLOADED = 1;
    // 载入的状态
    private static final int STATE_LOADING = 2;
    // 载入失败的状态
    private static final int STATE_ERROR = 3;
    // 载入空的状态
    private static final int STATE_EMPTY = 4;
    // 载入成功的状态
    private static final int STATE_SUCCEED = 5;
    private View mLoadingView;// 转圈的view
    private View mErrorView;// 错误的view
    private View mEmptyView;// 空的view
    private View mSucceedView;// 成功的view
    private int mState;// 默认的状态
    private int loadpage_empty;
    private int loadpage_error;
    private int loadpage_loading;
    public LoadingPager(Context context, int loading, int error, int empty) {
        super(context);
        loadpage_empty = empty;
        loadpage_error = error;
        loadpage_loading = loading;
        init();
    }
    public LoadingPager(Context context, AttributeSet attrs, int defStyle,
            int loading, int error, int empty) {
        super(context, attrs, defStyle);
        loadpage_empty = empty;
        loadpage_error = error;
        loadpage_loading = loading;
        init();
    }
    public LoadingPager(Context context, AttributeSet attrs, int loading,
            int error, int empty) {
        super(context, attrs);
        init();
    }
    private void init() {
        // 初始化状态
        mState = STATE_UNLOADED;
        // 初始化三个 状态的view 这个时候 三个状态的view叠加在一起了
        mLoadingView = createLoadingView();
        if (null != mLoadingView) {
            addView(mLoadingView, new LayoutParams(LayoutParams.MATCH_PARENT,
                    LayoutParams.MATCH_PARENT));
        }
        mErrorView = createErrorView();
        if (null != mErrorView) {
            addView(mErrorView, new LayoutParams(LayoutParams.MATCH_PARENT,
                    LayoutParams.MATCH_PARENT));
        }
        mEmptyView = createEmptyView();
        if (null != mEmptyView) {
            addView(mEmptyView, new LayoutParams(LayoutParams.MATCH_PARENT,
                    LayoutParams.MATCH_PARENT));
        }
        showSafePagerView();
    }
    private void showSafePagerView() {
        // 直接执行到主线程
        UIUtils.runInMainThread(new Runnable() {
            @Override
            public void run() {
                showPagerView();
            }
        });
    }
    private void showPagerView() {
        // 這個時候 都不為空 mState默認是STATE_UNLOADED狀態所以仅仅顯示 lodaing 以下的 error
        // 和empty临时不显示
        if (null != mLoadingView) {
            mLoadingView.setVisibility(mState == STATE_UNLOADED
                    || mState == STATE_LOADING ? View.VISIBLE :
            View.INVISIBLE);
        }
        if (null != mErrorView) {
            mErrorView.setVisibility(mState == STATE_ERROR ?
View.VISIBLE
                    : View.INVISIBLE);
        }
        if (null != mEmptyView) {
            mEmptyView.setVisibility(mState == STATE_EMPTY ?
View.VISIBLE
                    : View.INVISIBLE);
        }
        if (mState == STATE_SUCCEED && mSucceedView == null) {
            mSucceedView = createSuccessView();
            addView(mSucceedView, new LayoutParams
            (LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        }
        if (null != mSucceedView) {
            mSucceedView.setVisibility(mState == STATE_SUCCEED ?
View.VISIBLE : View.INVISIBLE);
        }
    }
    public void show() {
        // 第一次进来肯定要 转圈的 所以就算是 error和empty 也要让状态是 unload
        if (mState == STATE_ERROR || mState == STATE_EMPTY) {
            mState = STATE_UNLOADED;
        }
        // 假设是unload 就把状态 变为 loading了 这时候从server拿数据
        if (mState == STATE_UNLOADED) {
            mState = STATE_LOADING;
            TaskRunnable task = new TaskRunnable();
            ThreadManager.getLongPool().execute(task);
        }
        showSafePagerView();
    }
    /**
     * 制作界面
     *
     * @return
     */
    protected abstract View createSuccessView();
    /**
     * 处理下载 耗时操作
     *
     * @return
     */
    protected abstract LoadResult load();
    /**
     * 空界面
     *
     * @return
     */
    public View createEmptyView() {
        if (loadpage_empty != 0) {
            return UIUtils.inflate(loadpage_empty);
        }
        return null;
    }
    /**
     * 失败的页面
     *
     * @return
     */
    public View createErrorView() {
        if (loadpage_empty != 0) {
            return UIUtils.inflate(loadpage_error);
        }
        return null;
    }
    /**
     * 正在旋转的页面
     *
     * @return
     */
    public View createLoadingView() {
        if (loadpage_empty != 0) {
            return UIUtils.inflate(loadpage_loading);
        }
        return null;
    }
    class TaskRunnable implements Runnable {
        @Override
        public void run() {
            final LoadResult loadResult = load();
            SystemClock.sleep(500);
            UIUtils.runInMainThread(new Runnable() {
                @Override
                public void run() {
                    mState = loadResult.getValue();
                    showPagerView();
                }
            });
        }
    }
    public enum LoadResult {
        ERROR(3), EMPTY(4), SUCCESS(5);
        int value;
        LoadResult(int value) {
            this.value = value;
        }
        public int getValue() {
            return value;
        }
    }
}
以下是怎样使用了
package com.wang.cn.base;
import com.example.every_text.view.LoadingPager;
import com.example.every_text.view.LoadingPager.LoadResult;
import com.wang.cn.R;
import com.wang.cn.utils.UIUtils;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
/**
 * @author wang
 * @version 创建时间:2015年7月8日 上午11:31:11 类说明 activity的基类
 */
public abstract class BaseActivity extends Activity {
    public LoadingPager loadingPage;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        loadingPage = new LoadingPager(UIUtils.getContext(),
                R.layout.loadpage_loading, R.layout.loadpage_error,
                R.layout.loadpage_empty)//载入了三个页面
        {
            @Override
            protected LoadResult load() {
                return BaseActivity.this.load();//传递给子类
            }
            @Override
            protected View createSuccessView() {
                return BaseActivity.this.createSuccessView();//传递给子类
            }
        };
//      能够点击
        loadingPage.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                loadingPage.show();
            }
        });
//      显示 loading的页面
        loadingPage.show();
        setContentView(loadingPage);
    }
    /**
     * 刷新页面project
     *
     * @return
     */
    protected abstract View createSuccessView();
    /**
     * 请求server 获取当前状态
     *
     */
    protected abstract LoadResult load();
}
逼格的来了 基类调用父类怎样呢
package com.wang.cn;
import android.content.Intent;
import android.os.SystemClock;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import com.example.every_text.view.LoadingPager.LoadResult;
import com.wang.cn.base.BaseActivity;
import com.wang.cn.utils.UIUtils;
import com.wang.cn.utils.ViewUtils;
/**
 * @author wang
 * @version 创建时间:2015年7月8日 上午11:31:11 类说明 主函数
 */
public class MainActivity extends BaseActivity {
    // 刷新页面project
    @Override
    protected View createSuccessView() {
        View inflate = UIUtils.inflate(R.layout.activity_main);
        TextView tv=ViewUtils.findViewById(inflate, R.id.textView1);
        tv.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(UIUtils.getContext(),FragmetActivity.class);
                startActivity(intent);
            }
        });
        return inflate;
    }
    // 刷新页面project
    @Override
    protected LoadResult load() {
        SystemClock.sleep(2000);
        return LoadResult.SUCCESS;
    }
}
怎么样,開始我们说的 载入数据 和显示代码 都搞定了。再也不用由于 写loading儿烦恼了吧。
也不用由于 handler获取到好多msg儿烦恼在哪里加了。 
代码下载地址:http://download.csdn.net/detail/wanghao200906/8880719(有我使用多年的工具类)
高效抽取loading,再多的载入页面也不怕的更多相关文章
- 页面的input唤醒软键盘再收起后,页面会出现软键盘高度的空白背景
		微信浏览器在版本6.7.4及以上会有这个bug:页面的input唤醒软键盘再收起后,页面会出现软键盘高度的空白背景,触摸到滚动条会消失恢复! 解决代码 后台框架嵌入iframe的情景,iframe内部 ... 
- 上传文件时 重新载入页面以获取源代码 http://*/upload.php
		今天做一个处理上传文件的接口时碰到这样一个问题, 用的是element-ui的上传组件,但是上传失败, 抓包一看返回的是 重新载入页面以获取源代码 http://*/upload.php 网上搜了一下 ... 
- JS Window对象 计时器setInterval() 在执行时,从载入页面后每隔指定的时间执行代码。
		计时器setInterval() 在执行时,从载入页面后每隔指定的时间执行代码. 语法: setInterval(代码,交互时间); 参数说明: 1. 代码:要调用的函数或要执行的代码串. 2. 交互 ... 
- 屏蔽电信流氓广告造成的诡异的问题--Android WebView 长时间不能载入页面
		发如今家里的时候用Android App里的WebView打开站点非常慢,会有十几秒甚至更长时间的卡住. 可是在电脑上打开相同的网页却非常快. 查找这个问题的过程比較曲折,记录下来. 抓取Androi ... 
- ASP.NET MVC载入页面常用方法
		@RenderBody 在Razor引擎中没有了“母版页”,取而代之的是叫做“布局”的页面(_Layout.cshtml)放在了共享视图文件夹中.在这个页面中,会看到标签里有这样一条语句: @Rend ... 
- 从jsp到java文件再返回到前台页面的过程
		客户端请求jsp页面总共分为三个阶段: <%@ page language="java" contentType="text/html; charset=utf-8 ... 
- mui中confirm在苹果出现bug,confirm点击确定跳转页面再返回后,页面被遮罩盖住无法使用
		项目中使用confirm mui.confirm('您还未抽奖,现在去抽奖吗?', function (res) { if (res.index === 1) { window.location.hr ... 
- jquery 动态载入页面,并且保证 url 变动
		最近做一个新的项目,项目页头,导航,页尾是不变的,只有中间部分是通过加载其他页面,达到内容刷新的. 大概结构如下, 要求, 1. 正文部分可以通过加载一个页面达到刷新效果 2. 保留加载的页面 url ... 
- iframe载入页面过程显示动画效果
		http://www.xfeixiang.com/Bug/Detail/A2FD7EFFA8CA72F1 
随机推荐
- Ext中点击某个东西弹出框展示
			renderer:function(v){ return '<a href="123" data-qtitle="OK Button" data-qwid ... 
- 牛客网 暑期ACM多校训练营(第二场)D.money-贪心 or 动态规划
			D.money 贪心,直接贴官方的题解吧. 题目大意 你要按照顺序依次经过n个商店,每到达一个商店你可以购买一件商品,也可以出售你手中的商品. 同一时刻你手上最多拿一件商品.在第i个商店购买和出售的代 ... 
- HDU 1426 Sudoku Killer (回溯 + 剪枝)
			本文链接:http://i.cnblogs.com/EditPosts.aspx?postid=5398818 题意: 给你一个 9*9 的矩阵,同一行相邻的两个元素用一个空格分开.其中1-9代表该位 ... 
- 洛谷——P1067 多项式输出
			P1067 多项式输出 题目描述 一元 n 次多项式可用如下的表达式表示: 其中,aixi称为 i 次项,ai 称为 i 次项的系数.给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该 ... 
- tyvj——P1001 第K极值
			P1001 第K极值 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 成成第一次模拟赛 第一道 描述 给定一个长度为N(0<n<=10000)的序 ... 
- 使用参数化SQL
			Java.C#等语言提供了参数化SQL机制,使用参数化SQL开发人员为在运行时才能确定的参数值设置占位符,在执行的时候再指定这些占位符所代表的值.示例代码如下: string user=txtUser ... 
- luogu P1164 小A点菜
			题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过uim由于买了一些辅(e ... 
- 【bzoj1598】【 [Usaco2008 Mar]牛跑步】启发式搜索思路+spfa
			(上不了p站我要死了,侵权度娘背锅) 最近复习搜索,先从启发式搜索来吧. 感觉启发式搜索这玩意挺玄学的,先从其思想入手,做一道经典的K短路. Description BESSIE准备用从牛棚跑到池塘的 ... 
- 2.1多线程(java学习笔记) java中多线程的实现(附静态代理模式)
			一.多线程 首先我们要清楚程序.进程.线程的关系. 首先进程从属于程序,线程从属于进程. 程序指计算机执行操作或任务的指令集合,是一个静态的概念. 但我们实际运行程序时,并发程序因为相互制约,具有“执 ... 
- 九. 常用类库、向量与哈希2.Object类
			Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: p ... 
