1. 程式人生 > >Android 仿微博的點贊上報功能,持續點贊再取消

Android 仿微博的點贊上報功能,持續點贊再取消

             產品需求,實現類似微博的持續點贊再取消功能,因為自己也偶爾刷微博,對這功能有一定的使用上的瞭解,

       至於微博點讚的具體實現我並不知道,微博點贊在斷網的情況下依然能點贊,不會提示網路異常,等有網路之後

       重新重新整理,實際是沒有點讚的,那就針對這現象去實現吧.

            避免併發,減少CPU壓力,我個人會想到 HandlerThread ,不懂可以自行科普,這裡只說我實現的點贊功能原理.

    private Timer mTimer;//定時器
    private TimerTask mTask;

    mMap = new HashMap<>();
    mMainHandler = new MainHandler();//處理主執行緒任務
    mHandlerThread = new HandlerThread("praise_thread");
    mHandlerThread.start();//start()必須要在getLooper()前呼叫
    mThreadHandler = new ChildThreadHandler(mHandlerThread.getLooper());//處理子執行緒任務

       自身封裝一個單列的管理類:  

private Map<String, Map<Long, Integer>> mMap;//基於自身需求實現一個點讚的訊息管理器,我這裡第一個key是使用者,第二個key是內容的唯一ID
       把點贊訊息存放在管理器和加入任務佇列
    public void addReport(String userId, long aId, int state) {
        stopTask();//停止定時器
        init();//初始化操作
        Map<Long, Integer> map;
        if (mMap.containsKey(userId)) {//這是處理使用者key
            map = mMap.get(userId);
        } else {
            map = new Hashtable<>();//避免重複,自行科普
            mMap.put(userId, map);
        }
        if (!map.containsKey(aId)) {//如果存在說明handler佇列已經有但還沒被處理
             sendMsg(mThreadHandler, 0, userId, aId, state);//把任務加到子執行緒
        }
        map.put(aId, state);//記錄要提交的內容點贊狀態
    }

     子執行緒訊息處理:上報使用者操作的訊息,把上報結果發回給主執行緒

     主執行緒訊息處理 :  取出map裡面對應的值和上報結果比較,

                               1.存在一致性,則移除map中對應的key-value,再斷map是否還有訊息沒有上報,

                                  否則開啟定時器,定時把執行緒終止掉.

                               2.非一致性,則重新向子執行緒傳送上報訊息.

    以上原理非常簡單,不喜勿噴,請各大牛多多指教!!!!