All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.avos.avospush.session.MessageQueue Maven / Gradle / Ivy

The newest version!
package com.avos.avospush.session;

import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

import android.os.Handler;
import android.os.HandlerThread;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.avos.avoscloud.AVPersistenceUtils;
import com.avos.avoscloud.AVUtils;
import com.avos.avoscloud.LogUtil;

public class MessageQueue implements Queue {

  Queue messages;
  private final String queueKey;
  private static final String MESSAGE_ZONE = "com.avoscloud.chat.message";
  private static final String QUEUE_KEY = "com.avoscloud.chat.message.queue";
  private final Class type;
  static HandlerThread serializeThread = new HandlerThread("com.avos.avoscloud.push.messagequeue");
  static {
    serializeThread.start();
  }
  static Handler serializeHanlder = new Handler(serializeThread.getLooper());

  public MessageQueue(String peerId, Class type) {
    messages = new ConcurrentLinkedQueue();
    this.type = type;
    queueKey = QUEUE_KEY + "." + peerId;
    LinkedList storedMessages = restoreMessageQueue();
    if (storedMessages != null && storedMessages.size() > 0) {
      messages.addAll(storedMessages);
    }
  }

  @Override
  public boolean addAll(Collection collection) {
    boolean result = messages.addAll(collection);
    this.storeMessageQueue();
    return result;
  }

  @Override
  public void clear() {
    messages.clear();
    this.storeMessageQueue();
  }

  @Override
  public boolean contains(Object object) {
    return messages.contains(object);
  }

  @Override
  public boolean containsAll(Collection collection) {
    return messages.containsAll(collection);
  }

  @Override
  public boolean isEmpty() {
    return messages.isEmpty();
  }

  @Override
  public Iterator iterator() {
    return messages.iterator();
  }

  @Override
  public boolean remove(Object object) {
    boolean result = messages.remove(object);
    this.storeMessageQueue();
    return result;
  }

  @Override
  public boolean removeAll(Collection collection) {
    boolean result = messages.removeAll(collection);
    this.storeMessageQueue();
    return result;
  }

  @Override
  public boolean retainAll(Collection collection) {
    boolean result = messages.retainAll(collection);
    this.storeMessageQueue();
    return result;
  }

  @Override
  public int size() {
    return messages.size();
  }

  @Override
  public Object[] toArray() {
    return messages.toArray();
  }

  @Override
  public  T[] toArray(T[] array) {
    return messages.toArray(array);
  }

  @Override
  public boolean add(E e) {
    boolean result = messages.add(e);
    this.storeMessageQueue();
    return result;
  }

  @Override
  public boolean offer(E e) {
    boolean result = messages.offer(e);
    this.storeMessageQueue();
    return result;
  }

  @Override
  public E remove() {
    E result = messages.remove();
    this.storeMessageQueue();
    return result;
  }

  @Override
  public E poll() {
    E result = messages.poll();
    this.storeMessageQueue();
    return result;
  }

  @Override
  public E element() {
    E result = messages.element();
    this.storeMessageQueue();
    return result;
  }

  @Override
  public E peek() {
    return messages.peek();
  }

  private void storeMessageQueue() {
    // 异步序列化,保证效率
    serializeHanlder.post(new Runnable() {

      @Override
      public void run() {
        String queueString =
            JSON.toJSONString(messages, SerializerFeature.SkipTransientField,
                SerializerFeature.WriteClassName, SerializerFeature.QuoteFieldNames,
                SerializerFeature.WriteNullNumberAsZero, SerializerFeature.WriteNullBooleanAsFalse);
        AVPersistenceUtils.sharedInstance().savePersistentSettingString(MESSAGE_ZONE, queueKey,
            queueString);

      }
    });
  }

  private synchronized LinkedList restoreMessageQueue() {
    LinkedList storedMessages = new LinkedList();
    String queueString =
        AVPersistenceUtils.sharedInstance()
            .getPersistentSettingString(MESSAGE_ZONE, queueKey, null);
    if (!AVUtils.isBlankString(queueString)) {
      try {
        storedMessages.addAll(JSON.parseArray(queueString, type));
      } catch (Exception e) {
        // clean it since there's parse exception
        AVPersistenceUtils.sharedInstance().removePersistentSettingString(MESSAGE_ZONE, queueKey);
        LogUtil.log.e(e.getMessage());
      }
    }
    return storedMessages;
  }

  public interface HasId {
    public String getId();

    public void setId(String id);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy