diff --git a/briar-android/src/org/briarproject/android/blogs/BlogControllerImpl.java b/briar-android/src/org/briarproject/android/blogs/BlogControllerImpl.java index 2d20ab1e407c176dd84338994831f4afe262282b..fbed89b0c9943656fa845cb1856c410dde1d35c9 100644 --- a/briar-android/src/org/briarproject/android/blogs/BlogControllerImpl.java +++ b/briar-android/src/org/briarproject/android/blogs/BlogControllerImpl.java @@ -43,6 +43,8 @@ public class BlogControllerImpl extends DbControllerImpl protected volatile BlogManager blogManager; private final Map<MessageId, byte[]> bodyCache = new ConcurrentHashMap<>(); + private final Map<MessageId, BlogPostHeader> headerCache = + new ConcurrentHashMap<>(); private volatile BlogPostListener listener; private volatile GroupId groupId = null; @@ -127,6 +129,7 @@ public class BlogControllerImpl extends DbControllerImpl List<BlogPostItem> items = new ArrayList<>(headers.size()); now = System.currentTimeMillis(); for (BlogPostHeader h : headers) { + headerCache.put(h.getId(), h); byte[] body = getPostBody(h.getId()); items.add(new BlogPostItem(groupId, h, body)); } @@ -147,6 +150,12 @@ public class BlogControllerImpl extends DbControllerImpl public void loadBlogPost(final BlogPostHeader header, final ResultExceptionHandler<BlogPostItem, DbException> handler) { if (groupId == null) throw new IllegalStateException(); + byte[] body = bodyCache.get(header.getId()); + if (body != null) { + LOG.info("Loaded body from cache"); + handler.onResult(new BlogPostItem(groupId, header, body)); + return; + } runOnDbThread(new Runnable() { @Override public void run() { @@ -170,12 +179,18 @@ public class BlogControllerImpl extends DbControllerImpl public void loadBlogPost(final MessageId m, final ResultExceptionHandler<BlogPostItem, DbException> handler) { if (groupId == null) throw new IllegalStateException(); + BlogPostHeader header = headerCache.get(m); + if (header != null) { + LOG.info("Loaded header from cache"); + loadBlogPost(header, handler); + return; + } runOnDbThread(new Runnable() { @Override public void run() { try { long now = System.currentTimeMillis(); - BlogPostHeader header = blogManager.getPostHeader(m); + BlogPostHeader header = getPostHeader(m); byte[] body = getPostBody(m); long duration = System.currentTimeMillis() - now; if (LOG.isLoggable(INFO)) @@ -190,6 +205,15 @@ public class BlogControllerImpl extends DbControllerImpl }); } + private BlogPostHeader getPostHeader(MessageId m) throws DbException { + BlogPostHeader header = headerCache.get(m); + if (header == null) { + header = blogManager.getPostHeader(m); + headerCache.put(m, header); + } + return header; + } + private byte[] getPostBody(MessageId m) throws DbException { byte[] body = bodyCache.get(m); if (body == null) {