I´m using that way of cache Bitmaps in my app Using DiskLruCache in android 4.0 does not provide for openCache method
Thing is that I´m using that line in onCreate()
DiskLruImageCache dlic=new DiskLruImageCache(getApplicationContext(),"bckgCache", CACHESIZE, CompressFormat.PNG, 70);
and I´m pretty sure that It is overwriting my DiskLruCache everytime the app is opened "as new", so I´m not being able to recover some Bitmaps I catch las time user opened the app. So here is the question
How can I check I there´s already a DislLruCache created for an specific App so I will only create It If It doesn´t exist?
That's the class I'm using from the above URL
public class DiskLruImageCache {
private DiskLruCache mDiskCache;
private CompressFormat mCompressFormat = CompressFormat.PNG;
private int mCompressQuality = 70;
private static final int APP_VERSION = 1;
private static final int VALUE_COUNT = 1;
private static final String TAG = "DiskLruImageCache";
public DiskLruImageCache( Context context,String uniqueName, int diskCacheSize,
CompressFormat compressFormat, int quality ) {
try {
final File diskCacheDir = getDiskCacheDir(context, uniqueName );
mDiskCache = DiskLruCache.open( diskCacheDir, APP_VERSION, VALUE_COUNT, diskCacheSize );
mCompressFormat = compressFormat;
mCompressQuality = quality;
} catch (IOException e) {
e.printStackTrace();
}
}
private boolean writeBitmapToFile( Bitmap bitmap, DiskLruCache.Editor editor )
throws IOException, FileNotFoundException {
BufferedOutputStream out = null;
try {
out = new BufferedOutputStream( editor.newOutputStream( 0 ), Utils.IO_BUFFER_SIZE );
return bitmap.compress( mCompressFormat, mCompressQuality, out );
} finally {
if ( out != null ) {
out.close();
}
}
}
private File getDiskCacheDir(Context context, String uniqueName) {
// Check if media is mounted or storage is built-in, if so, try and use external cache dir
// otherwise use internal cache dir
final String cachePath =
Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ||
!Utils.isExternalStorageRemovable() ?
Utils.getExternalCacheDir(context).getPath() :
context.getCacheDir().getPath();
return new File(cachePath + File.separator + uniqueName);
}
public void put( String key, Bitmap data ) {
DiskLruCache.Editor editor = null;
try {
editor = mDiskCache.edit( key );
if ( editor == null ) {
return;
}
if( writeBitmapToFile( data, editor ) ) {
mDiskCache.flush();
editor.commit();
if ( BuildConfig.DEBUG ) {
Log.d( "cache_test_DISK_", "image put on disk cache " + key );
}
} else {
editor.abort();
if ( BuildConfig.DEBUG ) {
Log.d( "cache_test_DISK_", "ERROR on: image put on disk cache " + key );
}
}
} catch (IOException e) {
if ( BuildConfig.DEBUG ) {
Log.d( "cache_test_DISK_", "ERROR on: image put on disk cache " + key );
}
try {
if ( editor != null ) {
editor.abort();
}
} catch (IOException ignored) {
}
}
}
public Bitmap getBitmap( String key ) {
Bitmap bitmap = null;
DiskLruCache.Snapshot snapshot = null;
try {
snapshot = mDiskCache.get( key );
if ( snapshot == null ) {
return null;
}
final InputStream in = snapshot.getInputStream( 0 );
if ( in != null ) {
final BufferedInputStream buffIn =
new BufferedInputStream( in, Utils.IO_BUFFER_SIZE );
bitmap = BitmapFactory.decodeStream( buffIn );
}
} catch ( IOException e ) {
e.printStackTrace();
} finally {
if ( snapshot != null ) {
snapshot.close();
}
}
if ( BuildConfig.DEBUG ) {
Log.d( "cache_test_DISK_", bitmap == null ? "" : "image read from disk " + key);
}
return bitmap;
}
public boolean containsKey( String key ) {
boolean contained = false;
DiskLruCache.Snapshot snapshot = null;
try {
snapshot = mDiskCache.get( key );
contained = snapshot != null;
} catch (IOException e) {
e.printStackTrace();
} finally {
if ( snapshot != null ) {
snapshot.close();
}
}
return contained;
}
public void clearCache() {
if ( BuildConfig.DEBUG ) {
Log.d( "cache_test_DISK_", "disk cache CLEARED");
}
try {
mDiskCache.delete();
} catch ( IOException e ) {
e.printStackTrace();
}
}
public File getCacheFolder() {
return mDiskCache.getDirectory();
}
And this is what I'm doing into my Activity, wich doesn't works. If you try offline works the first time, second It doesn't (null pointer in OnPause because It can't find any Bitmap in the folder). If you try Online always works, but, if you try online, and then offline, instead load the previous downloaded image, is stops (null pointer), so, main problem is that It, for whatever reason, doesn't records or reads anything in the cache folder
public class Portada extends Activity {
private LinearLayout linearLayout;
private BitmapDrawable drawableBitmap;
private Bitmap b;
private DiskLruImageCache dlic;
private final String urlFondo="http://adapp.hostei.com/img/portada.jpg";
private final int MAXMEMORY = (int) (Runtime.getRuntime().maxMemory() / 1024);
private final int CACHESIZE = MAXMEMORY / 8;
private final String KEYPORTADA="bckportada";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_portada);
linearLayout=(LinearLayout)findViewById(R.id.fondoPortada);
Log.i("OnCreate","Starting");
File cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"bckgCache");
if(!cacheDir.exists()){ // check if it exits. if not create one
Log.i("OnCreate","Create not exsisting folder");
cacheDir.mkdirs();
dlic=new DiskLruImageCache(Portada.this,cacheDir.getName(), CACHESIZE, CompressFormat.PNG, 70);
}
else{
dlic=new DiskLruImageCache(Portada.this,cacheDir.getName(), CACHESIZE, CompressFormat.PNG, 70);
}
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.i("OnResume","Starting");
//checks if there's already a background image on cache
boolean hayportada=comprobarSiHayPortadaEnCache();
//creates a bckImage from R.drawable image if there's any already in cache
//this should only occurs once, the very first time the App runs
if(!hayportada){
b=BitmapFactory.decodeResource(getResources(), R.drawable.portada);
dlic.put(KEYPORTADA, b);
Log.i("onResume","Creates bckgImage from R.drawable");
}
//checks if there's any connection and if yes, loads the url image into cache and puts It as background
//if not load the image of the previous if
if(CheckOnline.isOnline(Portada.this)){
cargarPortadaUrl(urlFondo);//loads image from url and stores in cache
cargarImagenPortada(b);//put image as layout background
Log.i("onResume","there is online, down img");
}
else{
b=dlic.getBitmap(KEYPORTADA);
cargarImagenPortada(b);
Log.i("onResume","there's not online ");
}
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
dlic.put(KEYPORTADA, b);//just in case, It's already done in OnResume;
Log.i("onPause","stores Bitmap");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_portada, menu);
return true;
}
/**
* Takes an image from url and stores It in cache
*
*/
public void cargarPortadaUrl(String urlFondo){
DownloadImageTask dit=new DownloadImageTask();//Async task that downloads an img
try {
b=dit.execute(urlFondo).get();
dlic.put(KEYPORTADA, b);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//loads a Bitmap as Layout Background image
public void cargarImagenPortada(Bitmap bitm){
drawableBitmap=new BitmapDrawable(bitm);
linearLayout.setBackgroundDrawable(drawableBitmap);
}
//checks if there's any
public boolean comprobarSiHayPortadaEnCache(){
b=dlic.getBitmap(KEYPORTADA);
if(b==null)return false;
else return true;
}
}