FolderMessageList performance improvement from debauchedsloth++ (Partial application of his patch from Issue 285)

This commit is contained in:
Jesse Vincent 2009-05-03 04:39:13 +00:00
parent 92a8c174cc
commit f2fa5ae2f6
1 changed files with 57 additions and 43 deletions

View File

@ -61,6 +61,14 @@ import com.android.email.mail.store.LocalStore;
import com.android.email.mail.store.LocalStore.LocalFolder; import com.android.email.mail.store.LocalStore.LocalFolder;
import com.android.email.mail.store.LocalStore.LocalMessage; import com.android.email.mail.store.LocalStore.LocalMessage;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/** /**
* FolderMessageList is the primary user interface for the program. This * FolderMessageList is the primary user interface for the program. This
* Activity shows a two level list of the Account's folders and each folder's * Activity shows a two level list of the Account's folders and each folder's
@ -160,6 +168,8 @@ public class FolderMessageList extends ExpandableListActivity
private boolean sortAscending = true; private boolean sortAscending = true;
private boolean sortDateAscending = false; private boolean sortDateAscending = false;
private static final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 1, 120000L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue());
private DateFormat getDateFormat() private DateFormat getDateFormat()
{ {
if (dateFormat == null) if (dateFormat == null)
@ -434,7 +444,7 @@ public class FolderMessageList extends ExpandableListActivity
class FolderUpdateWorker implements Runnable class FolderUpdateWorker implements Runnable
{ {
String mFolder; String mFolder;
FolderInfoHolder mHolder;
boolean mSynchronizeRemote; boolean mSynchronizeRemote;
/** /**
@ -444,9 +454,10 @@ public class FolderMessageList extends ExpandableListActivity
* @param folder * @param folder
* @param synchronizeRemote * @param synchronizeRemote
*/ */
public FolderUpdateWorker(String folder, boolean synchronizeRemote) public FolderUpdateWorker(FolderInfoHolder folder, boolean synchronizeRemote)
{ {
mFolder = folder; mFolder = folder.name;
mHolder = folder;
mSynchronizeRemote = synchronizeRemote; mSynchronizeRemote = synchronizeRemote;
} }
@ -454,35 +465,46 @@ public class FolderMessageList extends ExpandableListActivity
{ {
// Lower our priority // Lower our priority
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Email - UpdateWorker");
wakeLock.setReferenceCounted(false);
wakeLock.acquire(Email.WAKE_LOCK_TIMEOUT);
// Synchronously load the list of local messages // Synchronously load the list of local messages
try try
{ {
Store localStore = Store.getInstance(mAccount.getLocalStoreUri(), try
getApplication());
LocalFolder localFolder = (LocalFolder) localStore.getFolder(mFolder);
if (localFolder.getMessageCount() == 0 && localFolder.getLastChecked() <= 0)
{ {
mSynchronizeRemote = true; Store localStore = Store.getInstance(mAccount.getLocalStoreUri(),
getApplication());
LocalFolder localFolder = (LocalFolder) localStore.getFolder(mFolder);
if (localFolder.getMessageCount() == 0 && localFolder.getLastChecked() <= 0)
{
mSynchronizeRemote = true;
}
} catch (MessagingException me)
{
Log.e(Email.LOG_TAG,
"Unable to get count of local messages for folder " + mFolder, me);
} }
} catch (MessagingException me)
{
Log.e(Email.LOG_TAG,
"Unable to get count of local messages for folder " + mFolder, me);
}
if (mSynchronizeRemote) if (mSynchronizeRemote)
{ {
// Tell the MessagingController to run a remote update of this folder // Tell the MessagingController to run a remote update of this folder
// at it's leisure // at it's leisure
MessagingController.getInstance(getApplication()).synchronizeMailbox( MessagingController.getInstance(getApplication()).synchronizeMailbox(
mAccount, mFolder, mAdapter.mListener); mAccount, mFolder, mAdapter.mListener);
} }
else else
{ {
MessagingController.getInstance(getApplication()).listLocalMessages( MessagingController.getInstance(getApplication()).listLocalMessages(
mAccount, mFolder, mAdapter.mListener); mAccount, mFolder, mAdapter.mListener);
}
} }
finally
{
wakeLock.release();
}
} }
} }
@ -689,12 +711,10 @@ public class FolderMessageList extends ExpandableListActivity
mListView.setSelectionFromTop(position, 0); mListView.setSelectionFromTop(position, 0);
} }
final FolderInfoHolder folder = (FolderInfoHolder) mAdapter.getGroup(groupPosition); final FolderInfoHolder folder = (FolderInfoHolder)
if (folder.messages.size() == 0 || folder.needsRefresh) mAdapter.getGroup(groupPosition);
{ if (folder.messages.size() == 0 || folder.needsRefresh)
folder.needsRefresh = false; threadPool.execute(new FolderUpdateWorker(folder, false));
new Thread(new FolderUpdateWorker(folder.name, false)).start();
}
} }
@ -1052,6 +1072,7 @@ public class FolderMessageList extends ExpandableListActivity
holder.message.getFolder().getName(), holder.message, folder.name, null); holder.message.getFolder().getName(), holder.message, folder.name, null);
} }
private void onReply(MessageInfoHolder holder) private void onReply(MessageInfoHolder holder)
{ {
MessageCompose.actionReply(this, mAccount, holder.message, false); MessageCompose.actionReply(this, mAccount, holder.message, false);
@ -1319,8 +1340,8 @@ public class FolderMessageList extends ExpandableListActivity
MessagingController.getInstance(getApplication()).sendPendingMessages(mAccount, null); MessagingController.getInstance(getApplication()).sendPendingMessages(mAccount, null);
break; break;
case R.id.check_mail: case R.id.check_mail:
Log.i(Email.LOG_TAG, "refresh folder " + folder.name); Log.i(Email.LOG_TAG, "refresh folder " + folder.name);
new Thread(new FolderUpdateWorker(folder.name, true)).start(); threadPool.execute(new FolderUpdateWorker(folder, true));
break; break;
case R.id.folder_settings: case R.id.folder_settings:
Log.i(Email.LOG_TAG, "edit folder settings for " + folder.name); Log.i(Email.LOG_TAG, "edit folder settings for " + folder.name);
@ -1334,7 +1355,6 @@ public class FolderMessageList extends ExpandableListActivity
Log.i(Email.LOG_TAG, "mark all unread messages as read " + folder.name); Log.i(Email.LOG_TAG, "mark all unread messages as read " + folder.name);
onMarkAllAsRead(mAccount, folder); onMarkAllAsRead(mAccount, folder);
break; break;
} }
} }
@ -1400,9 +1420,7 @@ public class FolderMessageList extends ExpandableListActivity
.getGroup(groupPosition); .getGroup(groupPosition);
if (!folder.name.equals(mAccount.getTrashFolderName())) if (!folder.name.equals(mAccount.getTrashFolderName()))
{
menu.findItem(R.id.empty_trash).setVisible(false); menu.findItem(R.id.empty_trash).setVisible(false);
}
if (folder.outbox) if (folder.outbox)
{ {
menu.findItem(R.id.check_mail).setVisible(false); menu.findItem(R.id.check_mail).setVisible(false);
@ -1614,13 +1632,9 @@ public class FolderMessageList extends ExpandableListActivity
*/ */
for (int i = 0, count = getGroupCount(); i < count; i++) for (int i = 0, count = getGroupCount(); i < count; i++)
{ {
if (mListView.isGroupExpanded(i)) final FolderInfoHolder folder = (FolderInfoHolder) mAdapter.getGroup(i);
{ if(mListView.isGroupExpanded(i))
final FolderInfoHolder folder = (FolderInfoHolder) mAdapter threadPool.execute(new FolderUpdateWorker(folder, mRefreshRemote));
.getGroup(i);
new Thread(new FolderUpdateWorker(folder.name, mRefreshRemote))
.start();
}
} }
mRefreshRemote = false; mRefreshRemote = false;
} }
@ -2268,7 +2282,7 @@ public class FolderMessageList extends ExpandableListActivity
public boolean lastCheckFailed; public boolean lastCheckFailed;
public boolean needsRefresh = false; public boolean needsRefresh = false;
/** /**
* Outbox is handled differently from any other folder. * Outbox is handled differently from any other folder.
*/ */