package in.srain.cube.demo.datamodel; import in.srain.cube.demo.event.ImageListDataEvent; import in.srain.cube.demo.data.ImageListItem; import in.srain.cube.demo.request.API; import in.srain.cube.request.*; import in.srain.cube.util.CLog; import java.util.ArrayList; /** * When requesting data from web API, it is a good practice to encapsulate all the request logic in a module. * This class has some methods to show how to encapsulate the web request. * Every method can take some parameters which are related to the specific business logic, and a * callback which will be applied after the request is finished. * * @author http://www.liaohuqiu.net */ public class DemoRevertDataModel { /** * Demo for using {@link SimpleRequest} */ public static void reverse(final String str, final RequestJsonHandler handler) { RequestHandler<JsonData> requestHandler = new RequestHandler<JsonData>() { @Override public JsonData processOriginData(JsonData jsonData) { return jsonData; } @Override public void onRequestFail(FailData failData) { CLog.d("demo-request", "onRequestFail"); } @Override public void onRequestFinish(JsonData data) { CLog.d("demo-request", "onRequestFinish: %s", data); handler.onRequestFinish(data); } }; SimpleRequest<JsonData> request = new SimpleRequest<JsonData>(requestHandler); RequestData requestData = request.getRequestData(); requestData.setRequestUrl(API.API_REVERT); requestData.addQueryData("str", str); request.send(); } public static void getImageList(final ImageListDataHandler handler) { getImageList(handler, 0, 7, false); } public static void getImageList(final ImageListDataHandler handler, int start, int num, boolean nocache) { CacheAbleRequestHandler requestHandler = new CacheAbleRequestHandler<ImageListDataEvent>() { @Override public void onCacheData(ImageListDataEvent data, boolean outOfDate) { CLog.d("demo-request", "data has been loaded form cache, out of date: %s", outOfDate); } @Override public void onCacheAbleRequestFinish(ImageListDataEvent data, CacheAbleRequest.ResultType type, boolean outOfDate) { CLog.d("demo-request", "onData: result type: %s, out of date: %s", type, outOfDate); handler.onData(data, type, outOfDate); } @Override public ImageListDataEvent processOriginData(JsonData jsonData) { JsonData data = jsonData.optJson("data"); ArrayList<JsonData> rawList = data.optJson("list").toArrayList(); ArrayList<ImageListItem> imageList = new ArrayList<ImageListItem>(); for (int i = 0; i < rawList.size(); i++) { ImageListItem item = new ImageListItem(rawList.get(i)); imageList.add(item); } ImageListDataEvent imageListDataEvent = new ImageListDataEvent(); imageListDataEvent.imageList = imageList; imageListDataEvent.hasMore = data.optBoolean("has_more"); return imageListDataEvent; } @Override public void onRequestFail(FailData requestResultType) { CLog.d("demo-request", "onRequestFail"); } @Override public void onRequestFinish(ImageListDataEvent data) { CLog.d("demo-request", "onRequestFinish"); } }; CacheAbleRequest<JsonData> request = new CacheAbleRequest<JsonData>(requestHandler); String cacheKey = String.format("image-list-%s-%s", start, num); String url = API.API_IMAGE_LIST; RequestData requestData = request.getRequestData(); requestData.setRequestUrl(url); requestData.addQueryData("start", start); requestData.addQueryData("num", num); request.setAssertInitDataPath("request_init/demo/image-list.json"); request.setCacheKey(cacheKey); // Uncomment following line to use the data from cache when cache is available // no matter whether it is expired or not. // request.setUseCacheAnyway(true); // When cache is available and request time has exceeded the timeout time, // cache data will be used. // request.setTimeout(1000); request.send(); } /** * customized callback, notified when data loaded */ public static interface ImageListDataHandler { public void onData(ImageListDataEvent data, CacheAbleRequest.ResultType type, boolean outOfDate); } }