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.
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)
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 😢
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 experimentoWebpSupportEnabled
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.