Получить файл GIF на фреске с Kotlin - PullRequest
0 голосов
/ 03 июня 2018

У меня есть 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 */)
...