Давайте попробуем новый способ сделать это. Использование RxJava. Намного проще создавать прототипы и проще управлять множеством потоков, если вы хотите когда-либо запускать сотни таких отложенных задач одновременно, последовательно, в сочетании с асинхронными задачами, связанными с синхронными цепными асинхронными вызовами и т. Д.
Во-первых, настройте подписчика. Помните, new
на Subscriber
следует выполнять только один раз, чтобы избежать утечек памяти.
// Set up a subscriber once
private Subscuber<Long> delaySubscriber = new Subscuber<Long> () {
@Override
public void onCompleted() {
//Wrap up things as onCompleted is called once onNext() is over
}
@Override
public void onError(Throwable e) {
//Keep an eye open for this. If onCompleted is not called, it means onError has been called. Make sure to override this method
}
@Override
public void onNext(Long aLong) {
// aLong will be from 0 to 1000
// Yuor code logic goes here
// If you want to run this code just once, just add a counter and call onComplete when the counter runs the first time
}
}
Фрагмент ниже просто выдаст 1
в onNext () подписчика.
Обратите внимание, что это делается в вычислительном пуле потоков, созданном и управляемом библиотекой RxJava.
//Now when you want to start running your piece of cade, define an Observable interval that'll emit every second
private Observable<Long> runThisAfterDelay = Observable.just(1).delay(1000, TimeUnit.MILLISECONDS, Schedulers.computation());
// Subscribe to begin the emissions.
runThisAfterDelay.subscribe(delaySubscriber);
Если вы хотите запускать код, скажем, каждую секунду, то вы можете сделать это:
private Observable<Long> runThisOnInterval = Observable.interval(1000, TimeUnit.MILLISECONDS, Schedulers.computation());