Fresco: Error al cargar imágenes WebP en Gingerbread

Creado en 3 ago. 2017  ·  3Comentarios  ·  Fuente: facebook/fresco

Descripción

Las imágenes no se cargan en un dispositivo Samsung antiguo: Samsung S3 mini.

Parece que ha habido un cambio importante en el decodificador de imágenes y la purga de imágenes que ahora está causando problemas en dispositivos particulares.

La última versión de Fresco en la que NO se observó fue 0.14.1.

Información Adicional

  • Versión Fresco: 1.0.0 y superior
  • Versión de la plataforma: observada en Samsung GT-I9300 con Android 4.3 (API 18)

Registros relevantes tanto del sistema como de la excepción de onFailure Controller Listener usando Fresco 1.4.0

E/OpenGLRenderer: Cannot generate texture from bitmap
E/OpenGLRenderer: Cannot generate texture from bitmap
W/System.err: java.lang.NullPointerException
W/System.err:     at com.facebook.imagepipeline.platform.GingerbreadPurgeableDecoder.decodeFileDescriptorAsPurgeable(GingerbreadPurgeableDecoder.java:134)
W/System.err:     at com.facebook.imagepipeline.platform.GingerbreadPurgeableDecoder.decodeJPEGByteArrayAsPurgeable(GingerbreadPurgeableDecoder.java:75)
W/System.err:     at com.facebook.imagepipeline.platform.DalvikPurgeableDecoder.decodeJPEGFromEncodedImage(DalvikPurgeableDecoder.java:89)
W/System.err:     at com.facebook.imagepipeline.platform.GingerbreadPurgeableDecoder.decodeJPEGFromEncodedImage(GingerbreadPurgeableDecoder.java:41)
W/System.err:     at com.facebook.imagepipeline.decoder.DefaultImageDecoder.decodeJpeg(DefaultImageDecoder.java:187)
W/System.err:     at com.facebook.imagepipeline.decoder.DefaultImageDecoder$1.decode(DefaultImageDecoder.java:62)
W/System.err:     at com.facebook.imagepipeline.decoder.DefaultImageDecoder.decode(DefaultImageDecoder.java:125)
W/System.err:     at com.facebook.imagepipeline.producers.DecodeProducer$ProgressiveDecoder.doDecode(DecodeProducer.java:248)
W/System.err:     at com.facebook.imagepipeline.producers.DecodeProducer$ProgressiveDecoder.access$200(DecodeProducer.java:112)
W/System.err:     at com.facebook.imagepipeline.producers.DecodeProducer$ProgressiveDecoder$1.run(DecodeProducer.java:145)
W/System.err:     at com.facebook.imagepipeline.producers.JobScheduler.doJob(JobScheduler.java:207)
W/System.err:     at com.facebook.imagepipeline.producers.JobScheduler.access$000(JobScheduler.java:27)
W/System.err:     at com.facebook.imagepipeline.producers.JobScheduler$1.run(JobScheduler.java:78)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
W/System.err:     at com.facebook.imagepipeline.core.PriorityThreadFactory$1.run(PriorityThreadFactory.java:43)
W/System.err:     at java.lang.Thread.run(Thread.java:841)
bug

Comentario más útil

Puedo ver la causa, dentro de WebpSupportStatus, que no establece la instancia estática del decodificador.

Si está llegando a esta línea, supongo que su ImagePipelineConfig solicita el experimento WebpSupportEnabled y que esta es una imagen WebP.

Arreglaré el error, pero la buena noticia es que no es necesario habilitar esa marca para que las imágenes WebP funcionen. No es un método bien nombrado, así que también agregaré un Javadoc significativo.

Todos 3 comentarios

Puedo ver la causa, dentro de WebpSupportStatus, que no establece la instancia estática del decodificador.

Si está llegando a esta línea, supongo que su ImagePipelineConfig solicita el experimento WebpSupportEnabled y que esta es una imagen WebP.

Arreglaré el error, pero la buena noticia es que no es necesario habilitar esa marca para que las imágenes WebP funcionen. No es un método bien nombrado, así que también agregaré un Javadoc significativo.

Cuando llegué a arreglar esto, descubrí que el decodificador debería estar configurado después de todo. Sin embargo, volveré a esto cuando tenga tiempo.

¿Ha intentado apagar la bandera y eso ayudó?

Hola @kirwan ,
Encontré códigos en ImagePipelineConfig.java

      // We check using introspection only if the experiment is enabled
      if (mImagePipelineExperiments.isWebpSupportEnabled() &&
          WebpSupportStatus.sIsWebpSupportRequired) {
        webpBitmapFactory = WebpSupportStatus.loadWebpBitmapFactoryIfExists();
        if (webpBitmapFactory != null) {
          BitmapCreator bitmapCreator = new HoneycombBitmapCreator(getPoolFactory());
          setWebpBitmapFactory(webpBitmapFactory, mImagePipelineExperiments, bitmapCreator);
        }
      }

Como puede ver, si se ejecuta en Android 4.3, WebpSupportStatus.sIsWebpSupportRequired es falso cuando enciende la bandera.
Entonces no hay posibilidad de ejecutar el método WebpSupportStatus.loadWebpBitmapFactoryIfExists() .
Sin embargo, el método buildPlatformDecoder() en ImagePipelineFactory devuelve GingerbreadPurgeableDecoder . El NPE se lanza cuando GingerbreadPurgeableDecoder decodifica el archivo a través de sWebpBitmapFactory .

Es muy confuso para mi 😢

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

sungerk picture sungerk  ·  3Comentarios

eldk picture eldk  ·  3Comentarios

goodev picture goodev  ·  4Comentarios

hbzhzw picture hbzhzw  ·  3Comentarios

qiiyue picture qiiyue  ·  4Comentarios