Fresco: Utilice la imagen actual que se muestra en Drawee como marcador de posición para la siguiente solicitud

Reproduzco varias imágenes secuencialmente en el mismo SimpleDraweeView , el problema es que cuando se envía una nueva solicitud imageURI, SimpleDrweeView eliminará la imagen visualizada actual y la reemplazará por nada hasta que se descargue el URI. Así que dejará vacíos en la secuencia de reproducción (se podría pensar en lo que estoy tratando de hacer es animación de dibujos animados con fotos locales). Lo que me gustaría que el SimpleDrweeView dejar la imagen actual como es hasta que el nuevo es descargado y luego simplemente cambiarlo cuando esté listo.

Intenté usar el esquema bajo-res / alto-res de este boleto para poner el viejo uri como placeholder pero eso no trabajó (tenía el mismo efecto que antes).

Esto es lo que tengo ahora:

  SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view); draweeView.setImageURI(uri /* local image */); 

Y esto es lo que he intentado hasta ahora (no funcionó):

  SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view); Uri lowResUri, highResUri; DraweeController controller = Fresco.newDraweeControllerBuilder().setTapToRetryEnabled(true) .setLowResImageRequest(ImageRequest.fromUri((Uri) draweeView.getTag())) /*naive way to test the low/high res feature*/ .setImageRequest(ImageRequest.fromUri(uri)) .setOldController(draweeView.getController()) .build(); draweeView.setTag(uri); draweeView.setController(controller); 

One Solution collect form web for “Fresco: Utilice la imagen actual que se muestra en Drawee como marcador de posición para la siguiente solicitud”

Soy parte del equipo de Fresco y puede ser capaz de ayudar. Es extraño que experimente el mismo problema con la combinación de resolución baja / alta resolución. Si la imagen se muestra actualmente, significa que debe estar en la memoria caché de memoria de mapa de bits, lo que a su vez significa que debería ser capaz de cargar inmediatamente cuando se establece como una imagen de baja resolución la próxima vez que cambia al siguiente fotograma. ¿Está seguro de que está configurando el uri correcto como imagen de baja resolución? (Uri) draweeView.getTag() parece un poco sospechoso. Volvería a revisar esa parte.

Si el uri es realmente correcto, pero la imagen no está en el caché de mapa de bits más, valdría la pena investigar por qué la imagen que es visible no se pone en caché ya, ya que tenemos una lógica explícita en lugar que debe evitar desalojar las imágenes visibles. Vea cómo realizar un seguimiento de esto con el registro detallado aquí .

Si todo lo anterior falla, las terceras opciones son implementar realmente su propio DataSource . Puedo ayudar con eso, pero esto podría ser un poco involucrado. La idea básica es implementar un DataSource que envuelva otro DataSource que realmente proporciona la imagen. Entonces usted podría hacer algo como esto:

 // keep this instance somewhere mMyDataSourceSupplier = new MyDataSourceSupplier(); // build controller by specifying your custom datasource supplier instead of specifying any URIs. Fresco.newDraweeControllerBuilder() .setDataSourceSupplier(mMyDataSourceSupplier) .build() // later, when you need to change the image do mMyDataSourceSupplier.setUri(nextUri); // this is just an outline class MyDataSourceSupplier implements Supplier<DataSource<CloseableReference<CloseableImage>>> { private Uri mCurrentUri; private DataSource<CloseableReference<CloseableImage>> mCurrentDataSource; public void setUri(Uri uri) { mCurrentUri = uri; if (mCurrentDatasource != null) { mCurrentDataSource.setUri(uri); } } @Override public DataSource<CloseableReference<CloseableImage>> get() { mCurrentDataSource = new MyDataSource(); mCurrentDataSource.setUri(uri); return mCurrentDataSource; } private class MyDataSource extends AbstractDataSource<CloseableReference<CloseableImage>> { private DataSource mUnderlyingDataSource; @Override protected void closeResult(@Nullable CloseableReference<CloseableImage> result) { CloseableReference.closeSafely(result); } @Override @Nullable public CloseableReference<CloseableImage> getResult() { return CloseableReference.cloneOrNull(super.getResult()); } @Override public boolean close() { if (mUnderlyingDataSource != null) { mUnderlyingDataSource.close(); mUnderlyingDataSource = null; } return super.close(); } public void setUri(Uri uri) { if (mUnderlyingDataSource != null) { mUnderlyingDataSource.close(); mUnderlyingDataSource = null; } if (uri != null && !isClosed()) { mUnderlyingDataSource = Fresco.getImagePipeline().fetchDecodedImage(ImageRequest.fromUri(uri), null); mUnderlyingDataSource.subscribe(new BaseDataSubscriber { @Override protected void onNewResultImpl(DataSource<List<CloseableReference<CloseableImage>>> dataSource) { MyDataSource.super.setResult(dataSource.getResult(), false); } }); } } } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.