Come usare correttamente com.octo.android.robospice per cache bitmaps
Domanda
Sto usando l'esempio trovato qui: https://github.com/octo-online/robospice/wiki/starter-guide
e hanno tentato di estenderlo per supportare le richieste bitmap con la memorizzazione nella cache. Con il logcat impostato su Verbose, vedo i messaggi di registro che indicano che le bitmap vengono messe in cache con successo, ma tenta di leggere le bitmap dalla cache sulle chiamate successive stanno fallendo con il seguente messaggio di registro:
11-15 09: 14: 02.694: D // RichiestaRunner.java: 102 (5462): com.octo.android.robospice.persistence.exception.CacheLoadingException: org.Codehaus.jackson.map.jsonMappingException : Nessun costruttore adatto trovato per il tipo [Tipo semplice, classe Android.graphics.BitMap]: impossibile istanziare da JSON Object (è necessario aggiungere / abilita informazioni digitali?)
Ecco il codice pertinente dalla JsonspiceFactory:
@Override
public CacheManager createCacheManager(Application application) {
CacheManager cacheManager = new CacheManager();
try {
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int cacheSize = maxMemory / 8;
JacksonObjectPersisterFactory jacksonObjectPersisterFactory = new JacksonObjectPersisterFactory(application);
cacheManager.addPersister( jacksonObjectPersisterFactory );
// Try to add support for bitmap caching here
InFileBitmapObjectPersister filePersister = new InFileBitmapObjectPersister(application);
LruCacheBitmapObjectPersister memoryPersister = new LruCacheBitmapObjectPersister(filePersister, cacheSize);
cacheManager.addPersister(memoryPersister);
} catch (CacheCreationException e) {
e.printStackTrace();
}
return cacheManager;
}
.
Ed ecco il codice che richiama la chiamata SpiceManager per caricare l'immagine da cache o rete:
public void getNetworkBitmap(String url, String cacheKey, GetBitmapListener listener) {
GetMerchantLogoRequest request = new GetMerchantLogoRequest(url);
spiceManager.execute(request, cacheKey, DurationInMillis.ONE_HOUR, new NetworkBitmapRequestListener(listener));
}
private class NetworkBitmapRequestListener implements RequestListener<Bitmap> {
private GetBitmapListener listener;
public NetworkBitmapRequestListener(GetBitmapListener listener) {
this.listener = listener;
}
@Override
public void onRequestFailure(SpiceException spiceException) {
listener.onImageRequestFailure(spiceException);
}
@Override
public void onRequestSuccess(Bitmap logo) {
listener.onImageRequestSuccess(logo);
}
}
.
Ho bisogno di una fabbrica per ricostituire la bitmap dai dati della cache? Dal momento che questo non è un oggetto JSON, cosa devo fare per correggere il tentativo di utilizzare Jackson Json Mapping? Jackson fa la cosa giusta se I Aggiungi / Abilita informazioni digitali? Come faccio a farlo?
Grazie per aver letto così lontano!
-eric
Soluzione
Ho trovato la risposta che legge attraverso il cachemanager (link sotto) e inciampato sulla linea "Tutti gli elementi [Persisters] sono interrogati in ordine" Quindi ho ridotto le voci nel metodo createcachemanager e ora sta funzionando.
Altri suggerimenti