package com.xiaomi.xms.sales.loader;
import android.content.Context;
import com.xiaomi.xms.sales.loader.BaseResult.ResultStatus;
import com.xiaomi.xms.sales.request.HostManager;
import com.xiaomi.xms.sales.request.Request;
import com.xiaomi.xms.sales.util.ThreadPool;
import org.json.JSONObject;
public abstract class BasePageLoader<GenericResult extends BaseResult> extends
BaseLoader<GenericResult> {
// private static final String TAG = "BasePageLoader";
private int mPage;
private boolean mNeedNextPage;
public BasePageLoader(Context context) {
super(context);
mPage = 1;
mNeedNextPage = false;
}
public boolean hasNextPage() {
// 只要翻页了,就不需要从数据库取数据,只从服务器取数据
if (mNeedNextPage) {
mPage++;
}
setNeedDatabase(false);
return mNeedNextPage;
}
public void setPage(int page) {
mPage = page;
}
public int getPage() {
return mPage;
}
@Override
public void reload() {
if (!isLoading()) {
mPage = 1;
mNeedNextPage = false;
super.reload();
}
}
/**
* 从服务器将app列表载入缓存和数据库
*/
protected abstract class PageUpdateLTask extends BaseLoader<GenericResult>.UpdateTask {
protected boolean mIsAppend;
public PageUpdateLTask() {
if (mPage == 1) {
// 第一页时不是附加
mIsAppend = false;
} else {
mIsAppend = true;
}
}
/**
* 获得请求网络数据的Request
*/
protected abstract Request getRequest(int page);
@Override
protected final Request getRequest() {
return getRequest(mPage);
}
protected GenericResult doInBackground(Void... params) {
Request request = getRequest(mPage);
int status = request.getStatus();
GenericResult result = getResultInstance();
if (status == Request.STATUS_OK) {
final String etag = request.getEtag();
JSONObject mainObject = request.requestJSON();
GenericResult newResult = parseTaskResult(mainObject);
result = onDataLoaded(mResult, newResult);
final String jonsString = mainObject.toString();
if (!mIsAppend) {
ThreadPool.execute(new Runnable() {
public void run() {
saveCacheToDB(getCacheKey(), jonsString, etag);
}
});
}
return result;
} else if (status == Request.STATUS_NETWORK_UNAVAILABLE) {
result.setResultStatus(ResultStatus.NETWROK_ERROR);
} else if (status == Request.STATUS_AUTH_ERROR) {
result.setResultStatus(ResultStatus.AUTH_ERROR);
} else {
result.setResultStatus(ResultStatus.SERVICE_ERROR);
}
return result;
}
/**
* 子类可以对获取的数据进行处理,如果该方法返回null,则数据和界面不会更新
*/
protected GenericResult onDataLoaded(GenericResult oldResult, GenericResult newResult) {
mNeedNextPage = newResult.getCount() >= getPageSizeValue();
GenericResult processed = newResult;
if (mIsAppend) {
// 如果是附加,则最终显示的结果是旧数据与新数据的整合
processed = merge(oldResult, newResult);
}
// 返回整合后的数据
return processed;
}
protected abstract GenericResult merge(GenericResult oldResult, GenericResult newResult);
protected int getPageSizeValue() {
return HostManager.Parameters.Values.PAGESIZE_VALUE;
}
}
}