Serialize notification processing

pull/160/head
M66B 5 years ago
parent 6f47a2e22c
commit e386a405ae

@ -77,8 +77,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Properties; import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore; import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -121,9 +119,6 @@ class Core {
private static final long YIELD_DURATION = 200L; // milliseconds private static final long YIELD_DURATION = 200L; // milliseconds
private static final long MIN_HIDE = 60 * 1000L; // milliseconds private static final long MIN_HIDE = 60 * 1000L; // milliseconds
private static final ExecutorService executor =
Executors.newSingleThreadExecutor(Helper.backgroundThreadFactory);
static void processOperations( static void processOperations(
Context context, Context context,
EntityAccount account, EntityFolder folder, EntityAccount account, EntityFolder folder,
@ -1918,6 +1913,8 @@ class Core {
} }
static void notifyMessages(Context context, List<TupleMessageEx> messages) { static void notifyMessages(Context context, List<TupleMessageEx> messages) {
if (messages == null)
messages = new ArrayList<>();
Log.i("Notify messages=" + messages.size()); Log.i("Notify messages=" + messages.size());
NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
@ -2018,27 +2015,11 @@ class Core {
} }
if (remove.size() + add.size() > 0) { if (remove.size() + add.size() > 0) {
final DB db = DB.getInstance(context); DB db = DB.getInstance(context);
for (long id : remove)
executor.submit(new Runnable() { db.message().setMessageNotifying(Math.abs(id), 0);
@Override for (long id : add)
public void run() { db.message().setMessageNotifying(Math.abs(id), (int) Math.signum(id));
try {
db.beginTransaction();
for (long id : remove)
db.message().setMessageNotifying(Math.abs(id), 0);
for (long id : add)
db.message().setMessageNotifying(Math.abs(id), (int) Math.signum(id));
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(ex);
} finally {
db.endTransaction();
}
}
});
} }
} }
} }

@ -168,19 +168,25 @@ public class ServiceSynchronize extends ServiceBase {
}); });
db.message().liveUnseenNotify().observe(cowner, new Observer<List<TupleMessageEx>>() { db.message().liveUnseenNotify().observe(cowner, new Observer<List<TupleMessageEx>>() {
private ExecutorService executor =
Executors.newSingleThreadExecutor(Helper.backgroundThreadFactory);
@Override @Override
public void onChanged(List<TupleMessageEx> messages) { public void onChanged(final List<TupleMessageEx> messages) {
try { executor.submit(new Runnable() {
if (messages == null) @Override
messages = new ArrayList<>(); public void run() {
Core.notifyMessages(ServiceSynchronize.this, messages); try {
} catch (SecurityException ex) { Core.notifyMessages(ServiceSynchronize.this, messages);
Log.w(ex); } catch (SecurityException ex) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ServiceSynchronize.this); Log.w(ex);
prefs.edit().remove("sound").apply(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ServiceSynchronize.this);
} catch (Throwable ex) { prefs.edit().remove("sound").apply();
Log.e(ex); } catch (Throwable ex) {
} Log.e(ex);
}
}
});
} }
}); });

Loading…
Cancel
Save