Add sync executor

pull/189/head
Alex Baker 10 years ago
parent 9eb11c88f2
commit 3edd637711

@ -42,6 +42,7 @@ import org.slf4j.LoggerFactory;
import org.tasks.R; import org.tasks.R;
import org.tasks.injection.ForApplication; import org.tasks.injection.ForApplication;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import org.tasks.sync.SyncExecutor;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@ -72,12 +73,13 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
private final Preferences preferences; private final Preferences preferences;
private final GtasksTokenValidator gtasksTokenValidator; private final GtasksTokenValidator gtasksTokenValidator;
private final GtasksMetadata gtasksMetadataFactory; private final GtasksMetadata gtasksMetadataFactory;
private final SyncExecutor executor;
@Inject @Inject
public GtasksSyncV2Provider(TaskService taskService, MetadataService metadataService, StoreObjectDao storeObjectDao, GtasksPreferenceService gtasksPreferenceService, public GtasksSyncV2Provider(TaskService taskService, MetadataService metadataService, StoreObjectDao storeObjectDao, GtasksPreferenceService gtasksPreferenceService,
GtasksSyncService gtasksSyncService, GtasksListService gtasksListService, GtasksMetadataService gtasksMetadataService, GtasksSyncService gtasksSyncService, GtasksListService gtasksListService, GtasksMetadataService gtasksMetadataService,
GtasksTaskListUpdater gtasksTaskListUpdater, @ForApplication Context context, Preferences preferences, GtasksTaskListUpdater gtasksTaskListUpdater, @ForApplication Context context, Preferences preferences,
GtasksTokenValidator gtasksTokenValidator, GtasksMetadata gtasksMetadata) { GtasksTokenValidator gtasksTokenValidator, GtasksMetadata gtasksMetadata, SyncExecutor executor) {
this.taskService = taskService; this.taskService = taskService;
this.metadataService = metadataService; this.metadataService = metadataService;
this.storeObjectDao = storeObjectDao; this.storeObjectDao = storeObjectDao;
@ -90,6 +92,7 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
this.preferences = preferences; this.preferences = preferences;
this.gtasksTokenValidator = gtasksTokenValidator; this.gtasksTokenValidator = gtasksTokenValidator;
this.gtasksMetadataFactory = gtasksMetadata; this.gtasksMetadataFactory = gtasksMetadata;
this.executor = executor;
} }
@Override @Override
@ -119,14 +122,13 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
// TODO: Improve this logic. Should only be able to import from settings or something. // TODO: Improve this logic. Should only be able to import from settings or something.
final boolean isImport = false; final boolean isImport = false;
new Thread(new Runnable() {
@Override
public void run() {
callback.started(); callback.started();
try {
gtasksPreferenceService.recordSyncStart(); gtasksPreferenceService.recordSyncStart();
executor.execute(callback, new Runnable() {
@Override
public void run() {
String authToken = getValidatedAuthToken(); String authToken = getValidatedAuthToken();
final GtasksInvoker invoker = new GtasksInvoker(gtasksTokenValidator, authToken); final GtasksInvoker invoker = new GtasksInvoker(gtasksTokenValidator, authToken);
try { try {
@ -144,7 +146,7 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
final AtomicInteger finisher = new AtomicInteger(lists.length); final AtomicInteger finisher = new AtomicInteger(lists.length);
for (final StoreObject list : lists) { for (final StoreObject list : lists) {
new Thread(new Runnable() { executor.execute(callback, new Runnable() {
@Override @Override
public void run() { public void run() {
synchronizeListHelper(list, invoker, manual, handler, isImport); synchronizeListHelper(list, invoker, manual, handler, isImport);
@ -153,13 +155,10 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
finishSync(callback); finishSync(callback);
} }
} }
}).start(); });
}
} finally {
callback.finished();
} }
} }
}).start(); });
} }
private synchronized void pushUpdated(GtasksInvoker invoker) { private synchronized void pushUpdated(GtasksInvoker invoker) {
@ -199,11 +198,11 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
final boolean isImport = false; final boolean isImport = false;
new Thread(new Runnable() {
@Override
public void run() {
callback.started(); callback.started();
executor.execute(callback, new Runnable() {
@Override
public void run() {
try { try {
String authToken = getValidatedAuthToken(); String authToken = getValidatedAuthToken();
gtasksSyncService.waitUntilEmpty(); gtasksSyncService.waitUntilEmpty();
@ -213,7 +212,7 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
callback.finished(); callback.finished();
} }
} }
}).start(); });
} }
private String getValidatedAuthToken() { private String getValidatedAuthToken() {

@ -0,0 +1,39 @@
package org.tasks.sync;
import com.todoroo.astrid.sync.SyncResultCallback;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import static java.util.concurrent.ThreadPoolExecutor.DiscardPolicy;
public class SyncExecutor {
private final ExecutorService executor = new ThreadPoolExecutor(
0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>(),
new DiscardPolicy());
@Inject
public SyncExecutor() {
}
public void execute(final SyncResultCallback callback, final Runnable command) {
executor.execute(new Runnable() {
@Override
public void run() {
try {
command.run();
} catch (Exception e) {
executor.shutdownNow();
callback.finished();
}
}
});
}
}
Loading…
Cancel
Save