当今的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(有我使用多年的工具类)

最新文章

  1. 如何在虚拟机安装桌面Ubuntu
  2. MySQL主主复制
  3. 开发基于C#.NET的mongodb桌面版的应用程序(1)
  4. POJ1651Multiplication Puzzle[区间DP]
  5. CoordinatorLayout 自定义Behavior并不难,由简到难手把手带你飞
  6. OBIEE 11g:Error:nQSError 36010 Server version 318 cannot read the newer version of the repository
  7. MVC中前台所得
  8. TinyTask Portable(录制和回放电脑操作过程)
  9. 在vs中跑动kdtree 和 bbf
  10. 北大ACM(POJ1002-487-3279)
  11. ZOJ 3713 In 7-bit
  12. HTML5新增的一些属性和功能之八——web Worker
  13. ubuntu中文实训手册
  14. The area面积计算
  15. 如何对 GIT 分支进行规划? (转)
  16. 【一天一道LeetCode】#345. Reverse Vowels of a String
  17. python的__mro__与__slot__
  18. c/c++ 中的重要函数
  19. Android 2018最新的三方库
  20. zabbix设置报警通知

热门文章

  1. Selenium2+python自动化16-alert\confirm\prompt【转载】
  2. js/jquery获取元素,元素筛选器
  3. HDU 2544.最短路-最短路(Dijkstra)
  4. Hadoop打包成jar包在集群上运行时出现的各种问题以及解决方案
  5. servlet多线程同步问题
  6. Python的网络编程[4] -> DHCP 协议[1] -> DHCP 的 Python 实现
  7. 导出/导入Eclipse的workspace配置(备份Eclipse配置)
  8. JavaScript入门:006—JS函数的定义
  9. Qt中的非模式窗口配置;
  10. spring boot 引用外部配置文件