void (final boolean force, boolean useCache, @Nullable final ScrollToPolicy scrollToChangePolicy) { ThreadingAssertions.assertEventDispatchThread(); if (isDisposed()) return; final T requestProvider = getCurrentRequestProvider(); if (requestProvider == null) { myQueue.abort(); finishUpdate(NoDiffRequest.INSTANCE, force, scrollToChangePolicy); return; } DiffRequest cachedRequest = useCache ? loadRequestFast(requestProvider) : null; if (cachedRequest != null) { myQueue.abort(); finishUpdate(cachedRequest, force, scrollToChangePolicy); return; } if (useCache && !force && Objects.equals(myQueuedProvider, requestProvider)) { // Let the ongoing computation to finish - high chance, it will be up-to-date with our request. // Schedule double-check in case 'loadRequestFast' implements additional validation. myValidateQueuedProvider = true; return; } myQueuedProvider = requestProvider; myValidateQueuedProvider = false; myQueue.executeAndTryWait( indicator -> { final DiffRequest request = doLoadRequest(requestProvider, indicator); return () -> finishRequestLoading(request, force, scrollToChangePolicy, requestProvider); }, () -> applyRequest(new LoadingDiffRequest(getRequestName(requestProvider)), force, scrollToChangePolicy), getFastLoadingTimeMillis() ); }