public boolean startIfNotRunning(final I input) {
        synchronized (taskMutex) {

            //check if running
            if (taskDisposable != null) {
                return false;
            }

            final Observable<TaskValue<P, R>> lTaskLogic = taskSupplier.apply(input);
            checkNoLifecycleReferences(lTaskLogic, null);

            postEvent(new WorkerTaskEvent<>(this, WorkerTaskEventType.STARTED, input, null, null, null));

            //start new task
            final Disposable[] lTaskDisposable = new Disposable[1];
            final LambdaObserver<TaskValue<P, R>> lObserver = new LambdaObserver<>(tv -> {
                synchronized (taskMutex) {
                    if (tv.isResult) {
                        endAsynchronousRun(tv.result, null, input, lTaskDisposable[0]);
                    } else if (!lTaskDisposable[0].isDisposed()) {
                        postEvent(new WorkerTaskEvent<>(this, WorkerTaskEventType.PROGRESS, null, tv.progress, null, null));
                    }
                }
            },
                error -> endAsynchronousRun(null, error, input, lTaskDisposable[0]),
                () -> endAsynchronousRun(null, null, input, lTaskDisposable[0]),
                d -> { });
            lTaskDisposable[0] = lObserver;
            this.taskDisposable = lTaskDisposable[0];
            this.lastStartTimeMillis = System.currentTimeMillis();

            lTaskLogic.subscribeOn(taskScheduler).observeOn(observerScheduler, true).subscribe(lObserver);

            return true;
        }
    }
Starts this task if it is not currently running
main/src/main/java/cgeo/geocaching/utils/workertask/WorkerTask.java