Как правильно использовать com.octo.android.robospice для кэширования растровых изображений
Вопрос
Я использую пример, найденный здесь: https://github.com/octo-online/robospice/wiki/Starter-Guide
и попытались расширить его для поддержки растровых запросов с кэшированием.Если для LogCat установлено значение verbose, я вижу сообщения журнала, указывающие, что растровые изображения успешно помещаются в кэш, но попытки прочитать растровые изображения обратно из кэша при последующих вызовах завершаются неудачей со следующим сообщением журнала:
11-15 09:14:02.694:D//RequestRunner.java:102(5462):com.octo.android.robospice.persistence.исключение.Исключение CacheLoadingException:org.codehaus.исключение jackson.map.JsonMappingException:Не найден подходящий конструктор для типа [простой тип, класс android.graphics.Bitmap]:не удается создать экземпляр из объекта JSON (нужно добавить / включить информацию о типе?)
Вот соответствующий код из 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;
}
И вот код, который вызывает вызов SpiceManager для загрузки изображения из кэша или сети:
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);
}
}
Нужна ли мне фабрика для восстановления растрового изображения из данных кэша?Поскольку это не объект Json, что мне нужно сделать, чтобы исправить попытку использовать отображение Jackson Json?Правильно ли поступит Джексон, если я добавить / включить информацию о типе? Как мне это сделать?
Спасибо, что дочитали до этого места!
-Эрик
Решение
Я нашел ответ, прочитав CacheManager (ссылка ниже), и наткнулся на строку "Все элементы [сохраняемые]...ставятся под сомнение по порядку" итак, я переупорядочил записи в методе CreateCacheManager, и теперь он работает.
Другие советы
вы можете использовать BitmapRequest, вот пример: