Do alert work in background thread
* An ANR was reported in MailboxAlarmReceiver * The reciever calls into SyncManager, which does some database operations, and may abort an I/O operation in a sync service thread * Move this potentially long-running code into a background thread Bug: 2215045 Change-Id: Id65c51f706b212d6b50af3921f3ba3dc2d014ce0
This commit is contained in:
parent
ad33c5acf4
commit
bb2f25a23a
@ -1321,31 +1321,38 @@ public class SyncManager extends Service implements Runnable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static public void alert(Context context, long id) {
|
static public void alert(Context context, final long id) {
|
||||||
SyncManager syncManager = INSTANCE;
|
final SyncManager syncManager = INSTANCE;
|
||||||
checkSyncManagerServiceRunning();
|
checkSyncManagerServiceRunning();
|
||||||
if (id < 0) {
|
if (id < 0) {
|
||||||
kick("ping SyncManager");
|
kick("ping SyncManager");
|
||||||
} else if (syncManager == null) {
|
} else if (syncManager == null) {
|
||||||
context.startService(new Intent(context, SyncManager.class));
|
context.startService(new Intent(context, SyncManager.class));
|
||||||
} else {
|
} else {
|
||||||
AbstractSyncService service = syncManager.mServiceMap.get(id);
|
final AbstractSyncService service = syncManager.mServiceMap.get(id);
|
||||||
if (service != null) {
|
if (service != null) {
|
||||||
|
// Handle alerts in a background thread, as we are typically called from a
|
||||||
|
// broadcast receiver, and are therefore running in the UI thread
|
||||||
|
new Thread(new Runnable() {
|
||||||
|
public void run() {
|
||||||
Mailbox m = Mailbox.restoreMailboxWithId(syncManager, id);
|
Mailbox m = Mailbox.restoreMailboxWithId(syncManager, id);
|
||||||
if (m != null) {
|
if (m != null) {
|
||||||
// We ignore drafts completely (doesn't sync). Changes in Outbox are handled
|
// We ignore drafts completely (doesn't sync). Changes in Outbox are
|
||||||
// in the checkMailboxes loop, so we can ignore these pings.
|
// handled in the checkMailboxes loop, so we can ignore these pings.
|
||||||
if (m.mType == Mailbox.TYPE_DRAFTS || m.mType == Mailbox.TYPE_OUTBOX) {
|
if (m.mType == Mailbox.TYPE_DRAFTS || m.mType == Mailbox.TYPE_OUTBOX) {
|
||||||
String[] args = new String[] {Long.toString(m.mId)};
|
String[] args = new String[] {Long.toString(m.mId)};
|
||||||
ContentResolver resolver = INSTANCE.mResolver;
|
ContentResolver resolver = INSTANCE.mResolver;
|
||||||
resolver.delete(Message.DELETED_CONTENT_URI, WHERE_MAILBOX_KEY, args);
|
resolver.delete(Message.DELETED_CONTENT_URI, WHERE_MAILBOX_KEY,
|
||||||
resolver.delete(Message.UPDATED_CONTENT_URI, WHERE_MAILBOX_KEY, args);
|
args);
|
||||||
|
resolver.delete(Message.UPDATED_CONTENT_URI, WHERE_MAILBOX_KEY,
|
||||||
|
args);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
service.mAccount = Account.restoreAccountWithId(INSTANCE, m.mAccountKey);
|
service.mAccount = Account.restoreAccountWithId(INSTANCE, m.mAccountKey);
|
||||||
service.mMailbox = m;
|
service.mMailbox = m;
|
||||||
service.alarm();
|
service.alarm();
|
||||||
}
|
}
|
||||||
|
}}).start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user