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. LeetCode Flip Game II

    原题链接在这里:https://leetcode.com/problems/flip-game-ii/ 题目: You are playing the following Flip Game with ...

  2. Web:AJAX的网络请求

    要访问的json文件内容如下图: 1.通过XMLHttpRequest方式发送请求 (1)前提创建XMLHttpRequest对象: //发送请求 var request; if (window.XM ...

  3. 浅谈 man 命令的日常使用

    Linux系统提供了相对比较丰富的帮助手册(man),man是manual的缩写,在日常linux系统管理中经常用到,今天就简单聊聊man.man 本身也提供自己的帮助手册,通过man就可以查看. ( ...

  4. .net平台下深拷贝和浅拷贝

    在.net类库中,对象克隆广泛存在于各种类型的实现中,凡是实现了ICloneable接口的类型都具备克隆其对象实例的能力.所以本文讲述的深拷贝和浅拷贝也是在实现ICloneable接口的基础上进行的. ...

  5. ZOOKEEPER解惑

    现在网上关于ZooKeeper的文章很多,有介绍Leader选举算法的,有介绍ZooKeeper Server内部原理的,还有介绍ZooKeeper Client的.本文不打算再写类似的内容,而专注与 ...

  6. Power-BI免费版常用功能之同比、环比

    Power-BI免费版也可以实现同比.环比的功能.要实现同比.环比的功能,要在筛选行添加年份.月的筛选,并且指定某年份.月份.场景:如图想要在简表中显示上年收入.收入同比.收入同比差值.上月收入.收入 ...

  7. yaffs2文件系统镜像分析

    概述 yaffs2文件系统镜像通过mkyaffs2img工具制作,由源码可编译出两个镜像工具mkyaffsimage和mkyaffs2image,其中mkyaffsimage是针对yaffs文件系统, ...

  8. 单源最短路径——Dijkstra算法学习

    每次都以为自己理解了Dijkstra这个算法,但是过没多久又忘记了,这应该是第4.5次重温这个算法了. 这次是看的胡鹏的<地理信息系统>,看完之后突然意识到用数学公式表示算法流程是如此的好 ...

  9. 安装和删除 Alcatraz 插件

    在终端下输入如下命令来安装Alcatraz: curl -fsSL https://raw.github.com/supermarin/Alcatraz/master/Scripts/install. ...

  10. 实验十三_编写、应用中断例程_2 & 总结

    编写并安装int 7ch中断例程,功能为完成loop指令的功能 参数:(cx)= 循环次数,(bx)= 位移 以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察int.iret指令执行前后 ...