public DiskCacheProducer( BufferedDiskCache defaultBufferedDiskCache, BufferedDiskCache smallImageBufferedDiskCache, CacheKeyFactory cacheKeyFactory, Producer<EncodedImage> inputProducer) { mDefaultBufferedDiskCache = defaultBufferedDiskCache; mSmallImageBufferedDiskCache = smallImageBufferedDiskCache; mCacheKeyFactory = cacheKeyFactory; mInputProducer = inputProducer; } public void produceResults( final Consumer<EncodedImage> consumer, final ProducerContext producerContext) { ImageRequest imageRequest = producerContext.getImageRequest();//如果diskcache disabled的话,那么直接执行maybeStartInputProducer if (!imageRequest.isDiskCacheEnabled()) { maybeStartInputProducer(consumer, consumer, producerContext); return; } final ProducerListener listener = producerContext.getListener(); final String requestId = producerContext.getId(); listener.onProducerStart(requestId, PRODUCER_NAME); final CacheKey cacheKey = mCacheKeyFactory.getEncodedCacheKey(imageRequest); final BufferedDiskCache cache = imageRequest.getImageType() == ImageRequest.ImageType.SMALL ? mSmallImageBufferedDiskCache : mDefaultBufferedDiskCache; Continuation<EncodedImage, Void> continuation = new Continuation<EncodedImage, Void>() { //回调 @Override public Void then(Task<EncodedImage> task) throws Exception { //根据task是canceled,fault等状态决定如何执行 if (task.isCancelled() || (task.isFaulted() && task.getError() instanceof CancellationException)) { listener.onProducerFinishWithCancellation(requestId, PRODUCER_NAME, null); consumer.onCancellation(); } else if (task.isFaulted()) { listener.onProducerFinishWithFailure(requestId, PRODUCER_NAME, task.getError(), null); //出错了,就调用maybeStartInputProducer maybeStartInputProducer( consumer, new DiskCacheConsumer(consumer, cache, cacheKey), producerContext); } else { EncodedImage cachedReference = task.getResult(); if (cachedReference != null) { listener.onProducerFinishWithSuccess( requestId, PRODUCER_NAME, getExtraMap(listener, requestId, true)); consumer.onProgressUpdate(1); consumer.onNewResult(cachedReference, true); cachedReference.close(); } else { //没有结果,就调用maybeStartInputProducer listener.onProducerFinishWithSuccess( requestId, PRODUCER_NAME, getExtraMap(listener, requestId, false)); maybeStartInputProducer( consumer, new DiskCacheConsumer(consumer, cache, cacheKey), producerContext); } } return null; } }; AtomicBoolean isCancelled = new AtomicBoolean(false); final Task<EncodedImage> diskCacheLookupTask = cache.get(cacheKey, isCancelled);//执行task,task其实就是从缓存中取结果,执行后,前面的continuation就会被回调 diskCacheLookupTask.continueWith(continuation); subscribeTaskForRequestCancellation(isCancelled, producerContext); } //调用mInputProducer的produceResults private void maybeStartInputProducer( Consumer<EncodedImage> consumerOfDiskCacheProducer, Consumer<EncodedImage> consumerOfInputProducer, ProducerContext producerContext) { if (producerContext.getLowestPermittedRequestLevel().getValue() >= ImageRequest.RequestLevel.DISK_CACHE.getValue()) { consumerOfDiskCacheProducer.onNewResult(null, true); return; } mInputProducer.produceResults(consumerOfInputProducer, producerContext); }
联系客服