高效抽取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
随机推荐
- 设置电脑(windows)自动关机的方法
下面有三种设置方法可以自动关机. 设置一 定时自动关机 假如你需要电脑在20:20自动关机,那么只需要在“开始”菜单中选择“运行”,然后输入at 20:20 Shutdown -s,点击“确定”即可. ...
- 获取a'p'p签名
1.第一种方式 https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list& ...
- 让指定JS出现智能提示
大家都知道,在Asp.net MVC中,引入了CSS,JS捆绑优化这个好东东.但是,你会发现,运用了这个捆绑优化后,或者引用了模板后,在模板中引用了JS的文件后,在页面中编辑JS文件后,却不能利索地出 ...
- 反射main方法
利用Java反射机制去调用其他类的main方法基于这种情形: 当程序中的某个类在运行到某处需要去调用其他类的main方法时,如果此程序并不知道此main方法所属类的名称,而只是在程序中接受某一代表此m ...
- 线段树【SP1043】GSS1 - Can you answer these queries I
Description 给出了序列\(A_1,A_2,-,A_n\). \(a_i \leq 15007,1 \leq n \leq 50000\).查询定义如下: 查询\((x,y)=max{a_i ...
- ELK获取用户真实IP
原理:在filebeat这台服务器上的nginx中获取到客户端真实IP($clientRealIp), 然后在访问日志中添加"$clientRealIp"字段.1. 通过ma ...
- Moving Average from Data Stream -- LeetCode
Given a stream of integers and a window size, calculate the moving average of all integers in the sl ...
- 浅浅地谈一下随机算法【poj2454】【poj3318】
随机算法我也只是稍微接触了一下,就是想写篇博客自己稍微总结一下 其实随机算法也算是一个玄学吧,运气不好还是会wa.但是我们知道,计算机可以在短时间内计算大量的数据,所以碰到正确答案的概率还是挺大的. ...
- 【hdu3652】数位dp(浅尝ACM-A)
向大佬学习 第一次写博客有点紧张,也算是小萌新的突破吧 这次主要是总结一下校内的ACM比赛的各种题,主要是新思路以及学到的新知识 先放一张 下面开始说正事 题面 A wqb-number, or B- ...
- [POI2014]Tourism
题目大意: 给定一个$n(n\le20000)$条个点,$m(m\le25000)$条边的无向图,保证图中最长路径上的点数不超过$10$.对一个点染色的代价是$w_i$.求使得每个结点都被染色或至少有 ...