zoukankan      html  css  js  c++  java
  • 2021.5.11 Android软件缓冲加载页面

    一、今日学习内容

       参考文章:Android 自定义WebView 实现可以加载缓存数据 - Jason_Jan - 博客园 (cnblogs.com)

    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
  • 相关阅读:
    页面跳转
    基于MCP2515的Linux CAN总线驱动程序设计(三)
    基于MCP2515的Linux CAN总线驱动程序设计(二)
    基于MCP2515的Linux CAN总线驱动程序设计(一)
    任意ASCII码格式信息的huffman tree压缩(编码)和解压(译码)
    转:Linux环境下段错误的产生原因及调试方法小结
    转:C语言中volatile关键字的作用 专家博客
    处理字节对齐
    转: sizeof,总结
    sizeof()用法汇总
  • 原文地址:https://www.cnblogs.com/wmdww/p/14905842.html
Copyright © 2011-2022 走看看