LoadingPage的抽取
来源:互联网 发布:手机上怎样申请淘宝号 编辑:程序博客网 时间:2024/06/05 13:33
抽取的动机
任何一个联网的view界面展示都有四种情况,
①正在加载
②加载失败
③加载成功,但是没有数据
④加载成功,同时返回数据
public abstract class LoadingPager extends FrameLayout {//1.定义4种不同的显示状态private static final int STATE_LOADING = 1;private static final int STATE_ERROR = 2;private static final int STATE_EMPTY = 3;private static final int STATE_SUCCESS = 4;private int state_current = STATE_LOADING;//默认情况下,当前状态为正在加载//2.提供4种不同的界面private View view_loading;private View view_error;private View view_empty;private View view_success;private LayoutParams params;public LoadingPager(Context context) { this(context, null);}public LoadingPager(Context context, AttributeSet attrs) { this(context, attrs, 0);}public LoadingPager(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init();}//初始化方法private void init() { //实例化view //1.提供布局显示的参数 params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); if (view_loading == null) { //2.加载布局 view_loading = UIUtils.getView(R.layout.page_loading); //3.添加到当前的frameLayout中 addView(view_loading, params); } if (view_empty == null) { //2.加载布局 view_empty = UIUtils.getView(R.layout.page_empty); //3.添加到当前的frameLayout中 addView(view_empty, params); } if (view_error == null) { //2.加载布局 view_error = UIUtils.getView(R.layout.page_error); //3.添加到当前的frameLayout中 addView(view_error, params); } showSafePage();}//保证如下的操作在主线程中执行的:更新界面private void showSafePage() { UIUtils.runOnUiThread(new Runnable() { @Override public void run() { //保证run()中的操作在主线程中执行 showPage(); } });}private void showPage() { //根据当前state_current的值,决定显示哪个view view_loading.setVisibility(state_current == STATE_LOADING ? View.VISIBLE : View.INVISIBLE); view_error.setVisibility(state_current == STATE_ERROR ? View.VISIBLE : View.INVISIBLE); view_empty.setVisibility(state_current == STATE_EMPTY ? View.VISIBLE : View.INVISIBLE); if (view_success == null) { view_success = UIUtils.getView(layoutId()); addView(view_success, params); } view_success.setVisibility(state_current == STATE_SUCCESS ? View.VISIBLE : View.INVISIBLE);}public abstract int layoutId();private ResultState resultState;//在show()中实现联网加载数据public void show() { String url = url(); if (TextUtils.isEmpty(url)) { resultState = ResultState.SUCCESS; resultState.setContent(""); loadImage(); return; } UIUtils.getHandler().postDelayed(new Runnable() { @Override public void run() { //可以换成OKHttp,retrofit等其他框架 AsyncHttpClient client = new AsyncHttpClient(); client.get(url(), params(), new AsyncHttpResponseHandler() { @Override public void onSuccess(String content) { if (TextUtils.isEmpty(content)) {// "" or null //state_current = STATE_EMPTY; resultState = ResultState.EMPTY; resultState.setContent(""); } else { //state_current = STATE_SUCCESS; resultState = ResultState.SUCCESS; resultState.setContent(content); } //showSafePage(); loadImage(); } @Override public void onFailure(Throwable error, String content) { //state_current = STATE_ERROR; resultState = ResultState.ERROR; resultState.setContent(""); // showSafePage(); loadImage(); } }); } }, 2000);}private void loadImage() { switch (resultState) { case ERROR: state_current = STATE_ERROR; break; case EMPTY: state_current = STATE_EMPTY; break; case SUCCESS: state_current = STATE_SUCCESS; break; } //根据修改以后的state_current,更新视图的显示。 showSafePage(); if (state_current == STATE_SUCCESS) { onSuccss(resultState, view_success); }}protected abstract void onSuccss(ResultState resultState, View view_success);//提供联网的请求参数protected abstract RequestParams params();//提供联网的请求地址public abstract String url();//提供枚举类,封装联网以后的状态值和数据public enum ResultState { ERROR(2), EMPTY(3), SUCCESS(4); int state; ResultState(int state) { this.state = state; } private String content; public String getContent() { return content; } public void setContent(String content) { this.content = content; }}}
BaseFragment中简单使用
@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { /* View view= UIUtils.getView(getLayoutId()); unbinder = ButterKnife.bind(this, view); initTitle(); initData();*/ loadingPager = new LoadingPager(container.getContext()) { @Override public int layoutId() { return getLayoutId(); } @Override protected void onSuccss(ResultState resultState, View view_sucess) { unbinder = ButterKnife.bind(BaseFragment.this, view_sucess); initData(resultState.getContent()); initTitle(); } @Override protected RequestParams params() { return getParams(); } @Override public String url() { return geturl(); } }; return loadingPager;}
阅读全文