抽取的动机
任何一个联网的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
@Override
public 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;
}