package net.dev123.yibo.service.task; import java.util.ArrayList; import java.util.List; import java.util.concurrent.locks.ReentrantLock; import net.dev123.commons.Paging; import net.dev123.commons.util.ListUtil; import net.dev123.exception.ExceptionCode; import net.dev123.exception.LibException; import net.dev123.mblog.MicroBlog; import net.dev123.yibo.R; import net.dev123.yibo.common.Constants; import net.dev123.yibo.common.GlobalVars; import net.dev123.yibo.common.NetType; import net.dev123.yibo.common.NotificationEntity; import net.dev123.yibo.common.ResourceBook; 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.widget.PullToRefreshListView; import net.dev123.yibo.widget.Skeleton; import android.app.NotificationManager; import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import android.util.Log; import android.widget.Toast; public class MyHomePageUpTask extends AsyncTask<Void, Void, Boolean> { private static final String TAG = "MyHomePageUpTask"; private static ReentrantLock lock = new ReentrantLock(); private Context context; private MicroBlog microBlog = null; private MyHomeListAdapter adapter; private PullToRefreshListView listView; private List<net.dev123.mblog.entity.Status> listStatus; private String resultMsg = null; private boolean isAutoUpdate = false; private boolean isEmptyAdapter = false; public MyHomePageUpTask(MyHomeListAdapter adapter) { this.adapter = adapter; this.context = adapter.getContext(); listStatus = new ArrayList<net.dev123.mblog.entity.Status>(); microBlog = GlobalVars.getMicroBlog(adapter.getAccount()); } @Override protected void onPreExecute() { super.onPreExecute(); isEmptyAdapter = (adapter.getMax() == null); if (GlobalVars.NET_TYPE == NetType.NONE) { cancel(true); if (!isAutoUpdate) { resultMsg = ResourceBook.getStatusCodeValue(ExceptionCode.NET_UNCONNECTED, context); onPostExecute(false); } } } @Override protected Boolean doInBackground(Void... params) { boolean isSuccess = false; if (microBlog == null) { return isSuccess; } if (isAutoUpdate) { lock.lock(); } else { if (!lock.tryLock()) { resultMsg = context.getString(R.string.msg_update_conflict); return false; } } Paging<net.dev123.mblog.entity.Status> paging = new Paging<net.dev123.mblog.entity.Status>(); paging.setPageSize(GlobalVars.UPDATE_COUNT); net.dev123.mblog.entity.Status since = adapter.getMax(); if (since instanceof LocalStatus && ((LocalStatus)since).isDivider()) { since = null; } paging.setGlobalSince(since); if (paging.hasNext()) { paging.moveToNext(); try { List<net.dev123.mblog.entity.Status> statuses = microBlog.getHomeTimeline(paging); listStatus.addAll(statuses); } catch (LibException e) { if (Constants.DEBUG) Log.e(TAG, e.getMessage(), e); resultMsg = ResourceBook.getStatusCodeValue(e.getExceptionCode(), context); } } // Util.getResponseCounts(listStatus, microBlog); isSuccess = ListUtil.isNotEmpty(listStatus); if (isSuccess && paging.hasNext()) { LocalStatus localStatus = StatusUtil.createDividerStatus(listStatus, adapter.getAccount()); listStatus.add(localStatus); } //添加到适配器中,此处没有更新ui if (isSuccess) { adapter.addNewBlogs(listStatus); } lock.unlock(); return isSuccess; } @Override protected void onPostExecute(Boolean result) { super.onPostExecute(result); int cacheSize = adapter.getListNewBlogs().size(); if (result || cacheSize > 0) { if (isAutoUpdate) { sendBroadcast(); } else { addToAdapter(); } } else { if (resultMsg != null && !isAutoUpdate) { Toast.makeText(adapter.getContext(), resultMsg, Toast.LENGTH_LONG).show(); } else if (resultMsg == null && !isAutoUpdate) { Toast.makeText(adapter.getContext(), R.string.msg_latest_data, Toast.LENGTH_LONG).show(); } if (isEmptyAdapter) { setEmptyView(); } } if (!isAutoUpdate && listView != null) { listView.onRefreshComplete(); } } private void sendBroadcast() { //发送更新广播; Intent intent = new Intent(Constants.ACTION_RECEIVER_AUTO_UPDATE_NOTIFY); NotificationEntity entity = adapter.getNotificationEntity(); intent.putExtra("NOTIFICATION_ENTITY", entity); intent.putExtra("ACCOUNT", adapter.getAccount()); context.sendBroadcast(intent); } private void addToAdapter() { List<net.dev123.mblog.entity.Status> listNewBlog = adapter.getListNewBlogs(); int cacheSize = listNewBlog.size(); //如果通知已经存在; if (cacheSize > 0) { NotificationManager notiManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); notiManager.cancel(adapter.getAccount().getAccountId().intValue() * 100 + Skeleton.TYPE_MY_HOME); } if (cacheSize > 0 && listNewBlog.get(cacheSize - 1) instanceof LocalStatus ) { cacheSize--; } adapter.refresh(); if (!isAutoUpdate) { Toast.makeText( adapter.getContext(), adapter.getContext().getString(R.string.msg_refresh_frends_timeline, cacheSize), Toast.LENGTH_LONG ).show(); } } private void setEmptyView() { LocalAccount account = adapter.getAccount(); if (account == null) { return; } LocalStatus divider = new LocalStatus(); divider.setDivider(true); divider.setLocalDivider(true); listStatus.add(divider); adapter.addCacheToFirst(listStatus); } public boolean isAutoUpdate() { return isAutoUpdate; } public void setAutoUpdate(boolean isAutoUpdate) { this.isAutoUpdate = isAutoUpdate; } public PullToRefreshListView getListView() { return listView; } public void setListView(PullToRefreshListView listView) { this.listView = listView; } }