package net.dev123.yibo.service.task; import java.util.List; import net.dev123.commons.Paging; import net.dev123.commons.util.ListUtil; import net.dev123.exception.LibException; import net.dev123.mblog.MicroBlog; import net.dev123.yibo.common.GlobalVars; import net.dev123.yibo.db.LocalAccount; import net.dev123.yibo.db.LocalStatus; import net.dev123.yibo.service.adapter.MyHomeListAdapter; import net.dev123.yibo.service.adapter.StatusUtil; import net.dev123.yibo.service.cache.MyHomeCache; import net.dev123.yibo.service.cache.wrap.StatusWrap; import android.os.AsyncTask; public class MyHomeReadLocalTask extends AsyncTask<net.dev123.mblog.entity.Status, Void, Void> { private MyHomeListAdapter adapter; private MyHomeCache cache; private Paging<net.dev123.mblog.entity.Status> paging; private LocalStatus divider; List<StatusWrap> listWrap = null; List<net.dev123.mblog.entity.Status> listStatus = null; public MyHomeReadLocalTask(MyHomeListAdapter adapter, MyHomeCache cache, LocalStatus divider) { this.cache = cache; this.adapter = adapter; this.divider = divider; paging = adapter.getPaging(); } @Override protected void onPreExecute() { super.onPreExecute(); divider.setLoading(true); } @Override protected Void doInBackground(net.dev123.mblog.entity.Status... params) { if (params == null || params.length != 2 || !paging.hasNext()) { return null; } net.dev123.mblog.entity.Status max = params[0]; net.dev123.mblog.entity.Status since = params[1]; paging.setGlobalMax(max); paging.setGlobalSince(since); if (paging.moveToNext()) { listWrap = cache.read(paging); } if (ListUtil.isEmpty(listWrap)) { listStatus = getDataFromRemote(max, since); } return null; } @Override protected void onPostExecute(Void result) { divider.setLoading(false); if (ListUtil.isEmpty(listWrap) && ListUtil.isEmpty(listStatus)) { paging.setLastPage(true); adapter.notifyDataSetChanged(); return; } if (ListUtil.isNotEmpty(listWrap)) { cache.remove(cache.size() - 1); cache.addAll(cache.size(), listWrap); adapter.notifyDataSetChanged(); } else if (ListUtil.isNotEmpty(listStatus)) { adapter.addCacheToDivider(divider, listStatus); } } private List<net.dev123.mblog.entity.Status> getDataFromRemote(net.dev123.mblog.entity.Status max, net.dev123.mblog.entity.Status since) { LocalAccount account = adapter.getAccount(); MicroBlog microBlog = GlobalVars.getMicroBlog(account); List<net.dev123.mblog.entity.Status> listStatus = null; if (microBlog == null) { return listStatus; } Paging<net.dev123.mblog.entity.Status> paging = new Paging<net.dev123.mblog.entity.Status>(); paging.setGlobalMax(max); paging.setGlobalSince(since); if (paging.moveToNext()) { try { listStatus = microBlog.getHomeTimeline(paging); } catch (LibException e) { //resultMsg = e.getDescription(); paging.moveToPrevious(); } } Util.getResponseCounts(listStatus, microBlog); boolean isSuccess = ListUtil.isNotEmpty(listStatus); if (isSuccess && paging.hasNext()) { LocalStatus localStatus = StatusUtil.createDividerStatus(listStatus, account); listStatus.add(localStatus); } return listStatus; } }