package com.bumptech.glide.load.data;
import com.bumptech.glide.Priority;
import com.bumptech.glide.load.ResourceDecoder;
import com.bumptech.glide.load.model.ModelLoader;
/**
* A base class for lazily and retrieving data that can be used to load a resource. A new instance is created per image
* load by {@link ModelLoader}. {@link #loadData(Priority)} may or may not be called for any given load depending on
* whether or not the corresponding image is cached. Cancel also may or may not be called. If
* {@link #loadData(Priority)} is called, then so {@link #cleanup()} will be called.
*
* @param <T> The type of data to be loaded.
*/
public interface DataFetcher<T> {
/**
* Asynchronously fetch data from which a resource can be decoded. This will always be called on
* background thread so it is safe to perform long running tasks here. Any third party libraries called
* must be thread safe since this method will be called from a thread in a
* {@link java.util.concurrent.ExecutorService} that may have more than one background thread.
*
* This method will only be called when the corresponding image is not in the cache.
*
* @param priority The priority with which the request should be completed.
*/
public T loadData(Priority priority) throws Exception;
/**
* Cleanup or recycle any resources used by this data fetcher. This method will be called in a finally block
* after the data returned by {@link #loadData(Priority)} has been decoded by the {@link ResourceDecoder}.
*/
public void cleanup();
/**
* A method that will be called when a load is no longer relevant and has been cancelled. This method does not need
* to guarantee that any in process loads do not finish. It also may be called before a load starts or after it
* finishes.
*
* <p>
* The best way to use this method is to cancel any loads that have not yet started, but allow those that are in
* process to finish since its we typically will want to display the same image in a different view in
* the near future.
* </p>
*/
public void cancel();
}