import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import com.heima.googleplay.R;
import com.heima.googleplay.manager.ThreadManager;
import com.heima.googleplay.utils.UIUtils; import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
/**
*
*
* ============================================================
**/
public abstract class LoadingPage extends FrameLayout {
//默认状态
private final int UN_LOADING = 1;
//加载状态
private final int LOADING = 2;
//加载失败状态
private final int ERROR = 3;
//加载成功。然后服务器没有返回数据
private final int EMPTY = 4;
//加载成功的状态
private final int SUCCESS = 5;
//用来记录某种状态
private int mState;
private View mLoadingView;
private View mErrorView;
private View mEmptyView; private View mSuccessView;
public LoadingPage(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
} private void init() {
//首先赋值
mState = UN_LOADING; 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));
}
//成功页面根据业务不同页面将不同,所以在此无法添加统一界面
     //只能在主线程中展示出来
showSafePage(); }

  
private void showSafePage() {
UIUtils.runInMainThread(new Runnable() { @Override
public void run() {
showPage(); }
}); }

  //三种页面已经添加到FrameLayout中,通过显示和隐藏来控制显示那个
protected void showPage() {
if(null != mLoadingView){
mLoadingView.setVisibility(mState == UN_LOADING || mState == LOADING ? View.VISIBLE : View.INVISIBLE);
} if(null != mErrorView){
mErrorView.setVisibility(mState == ERROR ? View.VISIBLE : View.INVISIBLE);
} if(null != mEmptyView){
mEmptyView.setVisibility(mState == EMPTY ? View.VISIBLE : View.INVISIBLE);
} if(null == mSuccessView && mState == SUCCESS ){
mSuccessView = createSuccessView();
addView(mSuccessView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
}
if(null != mSuccessView){
mSuccessView.setVisibility(mState == SUCCESS ? View.VISIBLE : View.INVISIBLE);
}
} public abstract View createSuccessView();//创建成功后显示的业务界面 private View createEmptyView() {
// TODO Auto-generated method stub
return UIUtils.inflate(R.layout.loading_page_empty);
} private View createErrorView() {
// TODO Auto-generated method stub
return UIUtils.inflate(R.layout.loading_page_error);
} private View createLoadingView() {
// TODO Auto-generated method stub
return UIUtils.inflate(R.layout.loading_page_loading);
} public LoadingPage(Context context, AttributeSet attrs) {
super(context, attrs);
init();
} public LoadingPage(Context context) {
super(context);
init();
}
// //加载失败状态
// private final int ERROR = 3;
// //加载成功。然后服务器没有返回数据
// private final int EMPTY = 4;
// //加载成功的状态
// private final int SUCCESS = 5;
public enum LoadResult{
ERROR(3),EMPTY(4),SUCCESS(5);
int value ;
LoadResult(int value){
this.value = value;
}
public int getValue() {
return value;
}
}

  //利用线程池
private class LoadTask implements Runnable{ @Override
public void run() {
final LoadResult result = Load();
UIUtils.runInMainThread(new Runnable() { @Override
public void run() { mState = result.getValue(); showPage();
}
}); } } public void show() {
if(mState == ERROR || mState == EMPTY){
mState = UN_LOADING;
} if(mState == UN_LOADING){
mState = LOADING; LoadTask task = new LoadTask();
ThreadManager.getLongPool().execute(task);
// ExecutorService service = Executors.newFixedThreadPool(3);
// LoadTask task = new LoadTask();
// service.execute(task);
}
showSafePage();//加载完数据,在主线程中展示界面出来
}   
  
  //从服务器加载数据,返回加载状态(加载数据成功、失败?)
public abstract LoadResult Load() ; }
import java.util.List;

import com.heima.googleplay.utils.UIUtils;
import com.heima.googleplay.utils.ViewUtils;
import com.heima.googleplay.widget.LoadingPage;
import com.heima.googleplay.widget.LoadingPage.LoadResult; import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent; public abstract class BaseFragment extends Fragment { private LoadingPage mContentPage; //setContentView
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//当前的view已经有了一个父亲。必须移除
if(mContentPage == null){
mContentPage = new LoadingPage(UIUtils.getContext()) { @Override
public View createSuccessView() {
// TODO Auto-generated method stub
return BaseFragment.this.createSuccessView();
} @Override
public LoadResult Load() {
// TODO Auto-generated method stub
return BaseFragment.this.load();
}
};
}else{
ViewUtils.removeSelfFromParent(mContentPage);
} return mContentPage;
}
/**
* 检查服务器返回的json数据
* @param object
* @return
*/
protected LoadResult chece(Object object) {
if (object == null) {
return LoadResult.ERROR;
}
if (object instanceof List) {
List list = (List) object;
if (list.size() == 0) {
return LoadResult.EMPTY;
}
} return LoadResult.SUCCESS;
} protected abstract LoadResult load(); protected abstract View createSuccessView(); //在MainActivity中调用
public void show() {
if (null != mContentPage) {
mContentPage.show();
} } }
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.Menu; import com.heima.googleplay.fragment.AppFragment;
import com.heima.googleplay.fragment.BaseFragment;
import com.heima.googleplay.fragment.FragmentFactory;
import com.heima.googleplay.fragment.GameFragment;
import com.heima.googleplay.fragment.HomeFragment;
import com.heima.googleplay.utils.UIUtils;
import com.heima.googleplay.widget.PagerTab; public class MainActivity extends BaseActivity implements OnPageChangeListener { private PagerTab mTabs;
private ViewPager mPager; @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} private class MainAdapter extends FragmentStatePagerAdapter{ private String[] tab_names;
private BaseFragment fragment; public MainAdapter(FragmentManager fm) {
super(fm);
tab_names = UIUtils.getStringArray(R.array.tab_names);
} @Override
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
return tab_names[position];
} @Override
public Fragment getItem(int position) { return FragmentFactory.createFragment(position);
} @Override
public int getCount() {
// TODO Auto-generated method stub
return tab_names.length;
} } @Override
protected void initView() {
setContentView(R.layout.activity_main);
mTabs = (PagerTab) findViewById(R.id.tabs);
mPager = (ViewPager) findViewById(R.id.pager);
MainAdapter adapter = new MainAdapter(getSupportFragmentManager());
mPager.setAdapter(adapter);
//绑定到一起
mTabs.setViewPager(mPager);
mTabs.setOnPageChangeListener(this);
} @Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub } @Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub } @Override
public void onPageSelected(int arg0) {
BaseFragment fragment = FragmentFactory.createFragment(arg0);
fragment.show();
} }

MainActivity

android 应用架构随笔六(Loading加载页面)的更多相关文章

  1. Loading加载页面

    一般页面有四种情况 加载中 :就是滚动页面,后台获取加载的数据,每个页面的数据不同所以就让子类来实现,直接抽象abstract了. 加载失败 :一般都需要点击后重新加载 空页面 :也需要点击后重新加载 ...

  2. 携程Android App插件化和动态加载实践

    携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...

  3. 使用Dialog实现全局Loading加载框

    Dialog实现全局Loading加载框 很多人在实现Loading加载框的时候,都是在当前的页面隐藏一个Loading布局,需要加载的时候,显示出来,加载完再隐藏 使用Dialog实现Loading ...

  4. C#开发PACS医学影像处理系统(六):加载Dicom影像

    对于一款软件的扩展性和维护性来说,上层业务逻辑和UI表现一定要自己开发才有控制权,否则项目上线之后容易被掣肘, 而底层图像处理,我们不需要重复造轮子,这里推荐使用fo-dicom,同样基于Dicom3 ...

  5. 从架构层面谈web加载优化(个人整理)

    最近听了阿里一位大牛的讲座,讲web架构优化对网页加载的影响,看完之后对他所讲的一些优化方法进行一些总结和整理,发现收获还是蛮多的,下面多为个人整理和个人见解,希望有说的不对的,能及时指出 1.DNS ...

  6. [js开源组件开发]loading加载效果

    loading加载效果 由于程序和网络的原因,常常我们需要在交互的时候,给用户一个正在加载中的动画,于是,loading组件横空出世.不需要复杂的代码,也能完成大多数业务,这就是我做组件的原则. 效果 ...

  7. 【Android】首次进入应用时加载引导界面

    参考文章: [1]http://blog.csdn.net/wsscy2004/article/details/7611529 [2]http://www.androidlearner.net/and ...

  8. 2款不同样式的CSS3 Loading加载动画 附源码

    原文:2款不同样式的CSS3 Loading加载动画 附源码 我们经常看到的Loading加载很多都是转圈圈的那种,今天我们来换一种有创意的CSS3 Loading加载动画,一种是声波形状的动画,另一 ...

  9. HTML5 五彩圆环Loading加载动画实现教程

    原文:HTML5 五彩圆环Loading加载动画实现教程 今天我们要来介绍一款效果很特别的HTML5 Loading加载动画,不像其他的Loading动画,这款Loading动画颜色很丰富,并且在转圈 ...

随机推荐

  1. C#中value是什么意思

    value是c#中的“属性”例如c#某个类中有一个成员变量(字段),为了安全性,外部如果要访问它,必须通过“属性”来访问:private int _id;//这是一个成员变量,private表示是私有 ...

  2. 怎么使用git来管理项目版本?

    怎么使用git来管理项目版本和存放代码? 作者:rongfangliu 转载请注明出处:http://www.cnblogs.com/rongfangliu/p/howuseGit.html 工具: ...

  3. 诊断一句SQL不走索引的原因

    from http://www.itpub.net/thread-1852897-1-1.html 有论坛朋友在上面的帖子里问SQL为什么不走索引,正好这两天我也刚刚在看SQL优化,于是试着回答了一下 ...

  4. BIND_MISMATCH导致过多VERSION COUNT的问题

    并不是用了绑定变量就一定都会游标共享,下面我们介绍的就是一种例子.BIND_MISMATCH导致VERSION COUNT过多的原因解释: This is due to the bind buffer ...

  5. APICloud请你看英特尔智能硬件大赛决赛直播

    英特尔智能硬件大赛由英特尔硬享公社(CCE)发起,联合了全国各地50余家产业链优秀合作伙伴,旨在集合全国硬创资源,携手寻找中国最具代表性的硬件创业项目,并通过技术支持.资源对接.产品推广等方式助力项目 ...

  6. Android图片压缩方法总结

    本文总结Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法.比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩).   第一:质量压缩方法:   ? 1 2 3 ...

  7. Java数据库连接——JDBC基础知识(操作数据库:增删改查)

    一.JDBC简介 JDBC是连接java应用程序和数据库之间的桥梁. 什么是JDBC? Java语言访问数据库的一种规范,是一套API. JDBC (Java Database Connectivit ...

  8. yaffs2物理存储

    了解一个文件系统,除了了解运行机制(RAM结构)外,还需了解文件系统怎样物理存储的.RAM数据结构是为文件系统更好运行,而物理存储是文件系统载体.文件系统出问题后,最终要从物理存储寻找数据.参考&qu ...

  9. python计算非内置数据类型占用内存

    getsizeof的局限 python非内置数据类型的对象无法用sys.getsizeof()获得真实的大小,例: import networkx as nx import sys G = nx.Gr ...

  10. Vue.2.0.5-混合

    基础 混合是一种灵活的分布式复用 Vue 组件的方式.混合对象可以包含任意组件选项.以组件使用混合对象时,所有混合对象的选项将被混入该组件本身的选项. 例子: // 定义一个混合对象 var myMi ...