1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-05 10:49:24 +02:00

BookmarksActivity optimization

This commit is contained in:
Nikolay Pultsin 2013-03-06 07:33:02 +04:00
parent 31247e39bf
commit 19aeb9c9b6
8 changed files with 95 additions and 24 deletions

View file

@ -44,7 +44,7 @@ public class BookmarksActivity extends TabActivity implements MenuItem.OnMenuIte
private static final int DELETE_ITEM_ID = 2; private static final int DELETE_ITEM_ID = 2;
private final BookCollectionShadow myCollection = new BookCollectionShadow(); private final BookCollectionShadow myCollection = new BookCollectionShadow();
private volatile long myBookId = -1; private volatile Book myBook;
private final Comparator<Bookmark> myComparator = new Bookmark.ByTimeComparator(); private final Comparator<Bookmark> myComparator = new Bookmark.ByTimeComparator();
@ -68,6 +68,7 @@ public class BookmarksActivity extends TabActivity implements MenuItem.OnMenuIte
super.onCreate(bundle); super.onCreate(bundle);
Thread.setDefaultUncaughtExceptionHandler(new org.geometerplus.zlibrary.ui.android.library.UncaughtExceptionHandler(this)); Thread.setDefaultUncaughtExceptionHandler(new org.geometerplus.zlibrary.ui.android.library.UncaughtExceptionHandler(this));
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
requestWindowFeature(Window.FEATURE_NO_TITLE); requestWindowFeature(Window.FEATURE_NO_TITLE);
setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL); setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
@ -78,14 +79,26 @@ public class BookmarksActivity extends TabActivity implements MenuItem.OnMenuIte
final TabHost host = getTabHost(); final TabHost host = getTabHost();
LayoutInflater.from(this).inflate(R.layout.bookmarks, host.getTabContentView(), true); LayoutInflater.from(this).inflate(R.layout.bookmarks, host.getTabContentView(), true);
final Book book = myBook = SerializerUtil.deserializeBook(getIntent().getStringExtra(FBReader.BOOK_KEY));
SerializerUtil.deserializeBook(getIntent().getStringExtra(FBReader.BOOK_KEY));
myBookId = book != null ? book.getId() : -1;
} }
private class Initializer implements Runnable { private class Initializer implements Runnable {
public void run() { public void run() {
long id = 0; long id = 0;
if (myBook != null) {
while (true) {
final List<Bookmark> thisBookBookmarks =
myCollection.bookmarksForBook(myBook, id, 20);
if (thisBookBookmarks.isEmpty()) {
break;
} else {
id = thisBookBookmarks.get(thisBookBookmarks.size() - 1).getId() + 1;
}
myThisBookAdapter.addAll(thisBookBookmarks);
myAllBooksAdapter.addAll(thisBookBookmarks);
}
}
id = 0;
while (true) { while (true) {
final List<Bookmark> allBookmarks = myCollection.bookmarks(id, 20); final List<Bookmark> allBookmarks = myCollection.bookmarks(id, 20);
if (allBookmarks.isEmpty()) { if (allBookmarks.isEmpty()) {
@ -93,18 +106,13 @@ public class BookmarksActivity extends TabActivity implements MenuItem.OnMenuIte
} else { } else {
id = allBookmarks.get(allBookmarks.size() - 1).getId() + 1; id = allBookmarks.get(allBookmarks.size() - 1).getId() + 1;
} }
myAllBooksAdapter.addAll(allBookmarks); myAllBooksAdapter.addAll(allBookmarks);
if (myBookId != -1) {
final List<Bookmark> thisBookBookmarks = new LinkedList<Bookmark>();
for (Bookmark b : allBookmarks) {
if (b.getBookId() == myBookId) {
thisBookBookmarks.add(b);
}
}
myThisBookAdapter.addAll(thisBookBookmarks);
}
} }
runOnUiThread(new Runnable() {
public void run() {
setProgressBarIndeterminateVisibility(false);
}
});
} }
} }
@ -112,13 +120,19 @@ public class BookmarksActivity extends TabActivity implements MenuItem.OnMenuIte
protected void onStart() { protected void onStart() {
super.onStart(); super.onStart();
runOnUiThread(new Runnable() {
public void run() {
setProgressBarIndeterminateVisibility(true);
}
});
myCollection.bindToService(this, new Runnable() { myCollection.bindToService(this, new Runnable() {
public void run() { public void run() {
if (myAllBooksAdapter != null) { if (myAllBooksAdapter != null) {
return; return;
} }
if (myBookId != -1) { if (myBook != null) {
myThisBookAdapter = new BookmarksAdapter( myThisBookAdapter = new BookmarksAdapter(
createTab("thisBook", R.id.this_book), true createTab("thisBook", R.id.this_book), true
); );
@ -130,9 +144,7 @@ public class BookmarksActivity extends TabActivity implements MenuItem.OnMenuIte
); );
findViewById(R.id.search_results).setVisibility(View.GONE); findViewById(R.id.search_results).setVisibility(View.GONE);
final Thread initializer = new Thread(new Initializer()); new Thread(new Initializer()).start();
initializer.setPriority((Thread.MIN_PRIORITY + Thread.NORM_PRIORITY) / 2);
initializer.start();
} }
}); });

View file

@ -534,6 +534,19 @@ public class BookCollectionShadow extends AbstractBookCollection implements Serv
} }
} }
public synchronized List<Bookmark> bookmarksForBook(Book book, long fromId, int limitCount) {
if (myInterface == null) {
return Collections.emptyList();
}
try {
return SerializerUtil.deserializeBookmarkList(myInterface.bookmarksForBook(
SerializerUtil.serialize(book), fromId, limitCount
));
} catch (RemoteException e) {
return Collections.emptyList();
}
}
public synchronized void saveBookmark(Bookmark bookmark) { public synchronized void saveBookmark(Bookmark bookmark) {
if (myInterface != null) { if (myInterface != null) {
try { try {

View file

@ -54,6 +54,7 @@ interface LibraryInterface {
List<String> invisibleBookmarks(in String book); List<String> invisibleBookmarks(in String book);
List<String> bookmarks(in long fromId, in int limitCount); List<String> bookmarks(in long fromId, in int limitCount);
List<String> bookmarksForBook(in String book, in long fromId, in int limitCount);
String saveBookmark(in String bookmark); String saveBookmark(in String bookmark);
void deleteBookmark(in String bookmark); void deleteBookmark(in String bookmark);
} }

View file

@ -304,6 +304,12 @@ public class LibraryService extends Service {
return SerializerUtil.serializeBookmarkList(myCollection.bookmarks(fromId, limitCount)); return SerializerUtil.serializeBookmarkList(myCollection.bookmarks(fromId, limitCount));
} }
public List<String> bookmarksForBook(String book, long fromId, int limitCount) {
return SerializerUtil.serializeBookmarkList(myCollection.bookmarksForBook(
SerializerUtil.deserializeBook(book), fromId, limitCount
));
}
public String saveBookmark(String serialized) { public String saveBookmark(String serialized) {
final Bookmark bookmark = SerializerUtil.deserializeBookmark(serialized); final Bookmark bookmark = SerializerUtil.deserializeBookmark(serialized);
myCollection.saveBookmark(bookmark); myCollection.saveBookmark(bookmark);

View file

@ -735,10 +735,10 @@ final class SQLiteBooksDatabase extends BooksDatabase {
} }
@Override @Override
protected List<Bookmark> loadBookmarks(long bookId, boolean visible) { protected List<Bookmark> loadInvisibleBookmarks(long bookId) {
LinkedList<Bookmark> list = new LinkedList<Bookmark>(); LinkedList<Bookmark> list = new LinkedList<Bookmark>();
Cursor cursor = myDatabase.rawQuery( Cursor cursor = myDatabase.rawQuery(
"SELECT Bookmarks.bookmark_id,Bookmarks.book_id,Books.title,Bookmarks.bookmark_text,Bookmarks.creation_time,Bookmarks.modification_time,Bookmarks.access_time,Bookmarks.access_counter,Bookmarks.model_id,Bookmarks.paragraph,Bookmarks.word,Bookmarks.char FROM Bookmarks INNER JOIN Books ON Books.book_id = Bookmarks.book_id WHERE Bookmarks.book_id = ? AND Bookmarks.visible = ?", new String[] { "" + bookId, visible ? "1" : "0" } "SELECT bm.bookmark_id,bm.book_id,b.title,bm.bookmark_text,bm.creation_time,bm.modification_time,bm.access_time,bm.access_counter,bm.model_id,bm.paragraph,bm.word,bm.char FROM Bookmarks AS bm INNER JOIN Books AS b ON b.book_id = bm.book_id WHERE bm.book_id = ? AND bm.visible = 0", new String[] { String.valueOf(bookId) }
); );
while (cursor.moveToNext()) { while (cursor.moveToNext()) {
list.add(createBookmark( list.add(createBookmark(
@ -754,7 +754,7 @@ final class SQLiteBooksDatabase extends BooksDatabase {
(int)cursor.getLong(9), (int)cursor.getLong(9),
(int)cursor.getLong(10), (int)cursor.getLong(10),
(int)cursor.getLong(11), (int)cursor.getLong(11),
visible false
)); ));
} }
cursor.close(); cursor.close();
@ -764,7 +764,6 @@ final class SQLiteBooksDatabase extends BooksDatabase {
@Override @Override
protected List<Bookmark> loadVisibleBookmarks(long fromId, int limitCount) { protected List<Bookmark> loadVisibleBookmarks(long fromId, int limitCount) {
LinkedList<Bookmark> list = new LinkedList<Bookmark>(); LinkedList<Bookmark> list = new LinkedList<Bookmark>();
myDatabase.execSQL("DELETE FROM Bookmarks WHERE book_id = -1");
Cursor cursor = myDatabase.rawQuery("SELECT" + Cursor cursor = myDatabase.rawQuery("SELECT" +
" bm.bookmark_id,bm.book_id,b.title,bm.bookmark_text," + " bm.bookmark_id,bm.book_id,b.title,bm.bookmark_text," +
"bm.creation_time,bm.modification_time,bm.access_time,bm.access_counter," + "bm.creation_time,bm.modification_time,bm.access_time,bm.access_counter," +
@ -794,6 +793,40 @@ final class SQLiteBooksDatabase extends BooksDatabase {
return list; return list;
} }
@Override
protected List<Bookmark> loadVisibleBookmarks(long bookId, long fromId, int limitCount) {
LinkedList<Bookmark> list = new LinkedList<Bookmark>();
Cursor cursor = myDatabase.rawQuery("SELECT" +
" bm.bookmark_id,bm.book_id,b.title,bm.bookmark_text," +
"bm.creation_time,bm.modification_time,bm.access_time,bm.access_counter," +
"bm.model_id,bm.paragraph,bm.word,bm.char" +
" FROM Bookmarks AS bm INNER JOIN Books AS b ON b.book_id = bm.book_id" +
" WHERE b.book_id = ? AND bm.bookmark_id >= ? AND bm.visible = 1" +
" ORDER BY bm.bookmark_id LIMIT ?",
new String[] { String.valueOf(bookId), String.valueOf(fromId), String.valueOf(limitCount) }
);
while (cursor.moveToNext()) {
list.add(createBookmark(
cursor.getLong(0),
cursor.getLong(1),
cursor.getString(2),
cursor.getString(3),
SQLiteUtil.getDate(cursor, 4),
SQLiteUtil.getDate(cursor, 5),
SQLiteUtil.getDate(cursor, 6),
(int)cursor.getLong(7),
cursor.getString(8),
(int)cursor.getLong(9),
(int)cursor.getLong(10),
(int)cursor.getLong(11),
true
));
}
cursor.close();
return list;
}
private SQLiteStatement myInsertBookmarkStatement; private SQLiteStatement myInsertBookmarkStatement;
private SQLiteStatement myUpdateBookmarkStatement; private SQLiteStatement myUpdateBookmarkStatement;
@Override @Override

View file

@ -761,8 +761,12 @@ public class BookCollection extends AbstractBookCollection {
return myDatabase.loadVisibleBookmarks(fromId, limitCount); return myDatabase.loadVisibleBookmarks(fromId, limitCount);
} }
public List<Bookmark> bookmarksForBook(Book book, long fromId, int limitCount) {
return myDatabase.loadVisibleBookmarks(book.getId(), fromId, limitCount);
}
public List<Bookmark> invisibleBookmarks(Book book) { public List<Bookmark> invisibleBookmarks(Book book) {
final List<Bookmark> list = myDatabase.loadBookmarks(book.getId(), false); final List<Bookmark> list = myDatabase.loadInvisibleBookmarks(book.getId());
Collections.sort(list, new Bookmark.ByTimeComparator()); Collections.sort(list, new Bookmark.ByTimeComparator());
return list; return list;
} }

View file

@ -86,8 +86,9 @@ public abstract class BooksDatabase {
return new Bookmark(id, bookId, bookTitle, text, creationDate, modificationDate, accessDate, accessCounter, modelId, paragraphIndex, wordIndex, charIndex, isVisible); return new Bookmark(id, bookId, bookTitle, text, creationDate, modificationDate, accessDate, accessCounter, modelId, paragraphIndex, wordIndex, charIndex, isVisible);
} }
protected abstract List<Bookmark> loadBookmarks(long bookId, boolean isVisible); protected abstract List<Bookmark> loadInvisibleBookmarks(long bookId);
protected abstract List<Bookmark> loadVisibleBookmarks(long fromId, int limitCount); protected abstract List<Bookmark> loadVisibleBookmarks(long fromId, int limitCount);
protected abstract List<Bookmark> loadVisibleBookmarks(long bookId, long fromId, int limitCount);
protected abstract long saveBookmark(Bookmark bookmark); protected abstract long saveBookmark(Bookmark bookmark);
protected abstract void deleteBookmark(Bookmark bookmark); protected abstract void deleteBookmark(Bookmark bookmark);

View file

@ -92,6 +92,7 @@ public interface IBookCollection {
void markHyperlinkAsVisited(Book book, String linkId); void markHyperlinkAsVisited(Book book, String linkId);
List<Bookmark> bookmarks(long fromId, int limitCount); List<Bookmark> bookmarks(long fromId, int limitCount);
List<Bookmark> bookmarksForBook(Book book, long fromId, int limitCount);
List<Bookmark> invisibleBookmarks(Book book); List<Bookmark> invisibleBookmarks(Book book);
void saveBookmark(Bookmark bookmark); void saveBookmark(Bookmark bookmark);
void deleteBookmark(Bookmark bookmark); void deleteBookmark(Bookmark bookmark);