Pergunta

Estou usando o exemplo encontrado aqui: https://github.com/octo-online/robospice/wiki/Starter-Guide

e tentei estendê-lo para suportar solicitações de bitmap com cache.Com o LogCat definido como detalhado, vejo mensagens de log indicando que os bitmaps estão sendo colocados no cache com êxito, mas as tentativas de ler os bitmaps do cache em chamadas subsequentes estão falhando com a seguinte mensagem de log:

11-15 09:14:02.694:D//RequestRunner.java:102(5462):com.octo.android.robospice.persistence.exception.CacheLoadingException:org.codehaus.jackson.map.JsonMappingException:Nenhum construtor adequado encontrado para o tipo [tipo simples, classe android.graphics.Bitmap]:não é possível instanciar a partir do objeto JSON (é necessário adicionar/ativar informações de tipo?)

Aqui está o código relevante do 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;
}

E aqui está o código que invoca a chamada SpiceManager para carregar a imagem do cache ou da rede:

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);
    }
}

Preciso de uma fábrica para reconstituir o bitmap dos dados do cache?Como este não é um objeto Json, o que preciso fazer para corrigir a tentativa de usar o mapeamento Jackson Json?Jackson fará a coisa certa se eu adicionar/habilitar informações de tipo? Como faço isso?

Obrigado por ler até aqui!

-Érico

Foi útil?

Solução

Encontrei a resposta lendo o CacheManager (link abaixo) e tropecei na linha "Todos os elementos [persistem] ...são questionados em ordem", então reordenei as entradas no método CreateCacheManager e agora está funcionando.

http://grepcode.com/file/repo1.maven.org/maven2/com.octo.android.robospice/robospice-cache/1.3.1/com/octo/android/robospice/persistence/CacheManager.java

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top