mirror of
https://github.com/status-im/react-native.git
synced 2025-01-27 09:45:04 +00:00
Expose image cache interrogation to JS
Summary: Add a static `Image.queryCache` function that can query multiple URLs at once. The result is a map where each URL that is in cache is mapped to the cache type (memory/disk). URLs that are not cached do not appear in the result. Reviewed By: lexs Differential Revision: D3791333 fbshipit-source-id: b183015d97423f0c095bf891f035dac2e23d8d11
This commit is contained in:
parent
d3282e3bb1
commit
69c889815e
@ -185,6 +185,17 @@ var Image = React.createClass({
|
||||
abortPrefetch(requestId: number) {
|
||||
ImageLoader.abortRequest(requestId);
|
||||
},
|
||||
|
||||
/**
|
||||
* Perform cache interrogation.
|
||||
*
|
||||
* @param urls the list of image URLs to check the cache for.
|
||||
* @return a mapping from url to cache status, such as "disk" or "memory". If a requested URL is
|
||||
* not in the mapping, it means it's not in the cache.
|
||||
*/
|
||||
async queryCache(urls: Array<string>): Promise<Map<string, 'memory' | 'disk'>> {
|
||||
return await ImageLoader.queryCache(urls);
|
||||
}
|
||||
},
|
||||
|
||||
mixins: [NativeMethodsMixin],
|
||||
|
@ -20,15 +20,18 @@ import com.facebook.datasource.BaseDataSubscriber;
|
||||
import com.facebook.datasource.DataSource;
|
||||
import com.facebook.datasource.DataSubscriber;
|
||||
import com.facebook.drawee.backends.pipeline.Fresco;
|
||||
import com.facebook.imagepipeline.core.ImagePipeline;
|
||||
import com.facebook.imagepipeline.image.CloseableImage;
|
||||
import com.facebook.imagepipeline.request.ImageRequest;
|
||||
import com.facebook.imagepipeline.request.ImageRequestBuilder;
|
||||
import com.facebook.react.bridge.Arguments;
|
||||
import com.facebook.react.bridge.GuardedAsyncTask;
|
||||
import com.facebook.react.bridge.LifecycleEventListener;
|
||||
import com.facebook.react.bridge.Promise;
|
||||
import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||
import com.facebook.react.bridge.ReactMethod;
|
||||
import com.facebook.react.bridge.ReadableArray;
|
||||
import com.facebook.react.bridge.WritableMap;
|
||||
|
||||
public class ImageLoaderModule extends ReactContextBaseJavaModule implements
|
||||
@ -175,6 +178,28 @@ public class ImageLoaderModule extends ReactContextBaseJavaModule implements
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void queryCache(final ReadableArray uris, final Promise promise) {
|
||||
// perform cache interrogation in async task as disk cache checks are expensive
|
||||
new GuardedAsyncTask<Void, Void>(getReactApplicationContext()) {
|
||||
@Override
|
||||
protected void doInBackgroundGuarded(Void... params) {
|
||||
WritableMap result = Arguments.createMap();
|
||||
ImagePipeline imagePipeline = Fresco.getImagePipeline();
|
||||
for (int i = 0; i < uris.size(); i++) {
|
||||
String uriString = uris.getString(i);
|
||||
final Uri uri = Uri.parse(uriString);
|
||||
if (imagePipeline.isInBitmapMemoryCache(uri)) {
|
||||
result.putString(uriString, "memory");
|
||||
} else if (imagePipeline.isInDiskCacheSync(uri)) {
|
||||
result.putString(uriString, "disk");
|
||||
}
|
||||
}
|
||||
promise.resolve(result);
|
||||
}
|
||||
}.executeOnExecutor(GuardedAsyncTask.THREAD_POOL_EXECUTOR);
|
||||
}
|
||||
|
||||
private void registerRequest(int requestId, DataSource<Void> request) {
|
||||
synchronized (mEnqueuedRequestMonitor) {
|
||||
mEnqueuedRequests.put(requestId, request);
|
||||
|
Loading…
x
Reference in New Issue
Block a user