У меня есть recyclerview
, который отображает список изображений в формате GIF с использованием Fresco, библиотеки для Android.
Когда пользователь нажимает на изображение в recyclerview
, мне нужновозможность получить файл .gif
и сохранить его как somename.gif
Я попробовал этот код:
val contentRequest = ImageRequest.fromUri(items[position])
val cacheKey = DefaultCacheKeyFactory.getInstance().getEncodedCacheKey(contentRequest, null)
val imageResource = ImagePipelineFactory.getInstance().mainFileCache.getResource(cacheKey)
val file = (imageResource as FileBinaryResource).file
Log.d("VED-APP", file.name)
Но в результате получается: Lw0g1Jq7J0jUxSCCEZe3UwRa6-0.cnt
, что отличается от"somename.gif".
Итак, я попробовал этот код:
val contentRequest = ImageRequest.fromUri(items[position])
val imagePipeline = Fresco.getImagePipeline()
val dataSource : DataSource<CloseableReference<CloseableImage>> =
imagePipeline.fetchDecodedImage(contentRequest, null)
Но проблема в том, что мне нужно записать объект dataSource
в файл.
Я нашел этот пример кода, который может помочь мне записать dataSource
в файл, но я не знаю, как преобразовать его в Kotlin.Может ли кто-нибудь помочь мне преобразовать это?
Или, если кто-нибудь знает лучший способ получения файлов с Fresco, могут ли они предложить альтернативный метод?
DataSource<CloseableReference<T>> dataSource = ...;
DataSubscriber<CloseableReference<T>> dataSubscriber =
new BaseDataSubscriber<CloseableReference<T>>() {
@Override
protected void onNewResultImpl(
DataSource<CloseableReference<T>> dataSource) {
if (!dataSource.isFinished()) {
// if we are not interested in the intermediate images,
// we can just return here.
return;
}
CloseableReference<T> ref = dataSource.getResult();
if (ref != null) {
try {
// do something with the result
T result = ref.get();
...
} finally {
CloseableReference.closeSafely(ref);
}
}
}
@Override
protected void onFailureImpl(DataSource<CloseableReference<T>> dataSource) {
Throwable t = dataSource.getFailureCause();
// handle failure
}
};
dataSource.subscribe(dataSubscriber, executor);
ВажноОбновление One -
Я понял, как преобразовать большую часть приведенного выше кода в Kotlin.Единственная проблема заключается в том, что я не знаю, как использовать соответствующий executor
для подписки на dataSubscriber
, см. Код ниже для пояснения.
Согласно документации ,Я должен использовать исполнителя фоновых потоков, но я не уверен, как это сделать в Kotlin.
val dataSubscriber : DataSubscriber<CloseableReference<CloseableImage>> =
object : BaseDataSubscriber<CloseableReference<CloseableImage>>() {
override fun onNewResultImpl(dataSource: DataSource<CloseableReference<CloseableImage>>?) {
if(!dataSource!!.isFinished) {
return
}
val ref : CloseableReference<CloseableImage>? = dataSource.result
if(ref != null) {
try {
val result = ref.get()
} finally {
CloseableReference.closeSafely(ref)
}
}
}
override fun onFailureImpl(dataSource: DataSource<CloseableReference<CloseableImage>>?) {
Log.d("VED-APP","Fresco Failed to Fetch?")
}
}
val contentRequest = ImageRequest.fromUri(items[position])
val imagePipeline = Fresco.getImagePipeline()
val dataSource : DataSource<CloseableReference<CloseableImage>> =
imagePipeline.fetchDecodedImage(contentRequest, null)
dataSource.subscribe(dataSubscriber,/*I don't know what to put here */)