Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>You can use <a href="http://square.github.io/picasso/" rel="noreferrer">Picasso</a> as image loader.</p> <p><strong>Or</strong></p> <p>This is what I did:</p> <p>I created a class named DiskLruImageCache with a DiskLruCache <a href="https://github.com/JakeWharton/DiskLruCache" rel="noreferrer">(the one from Jake Wharton)</a> object and the same methods in the simple implementation on the dev guide (displaying bitmaps efficiently):</p> <pre><code>public class DiskLruImageCache { private DiskLruCache mDiskCache; private CompressFormat mCompressFormat = CompressFormat.JPEG; 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 { OutputStream 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(); } } </code></pre> <p>Utils source code is:</p> <pre><code>public class Utils { public static final int IO_BUFFER_SIZE = 8 * 1024; private Utils() {}; public static boolean isExternalStorageRemovable() { if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.GINGERBREAD) { return Environment.isExternalStorageRemovable(); } return true; } public static File getExternalCacheDir(Context context) { if (hasExternalCacheDir()) { return context.getExternalCacheDir(); } // Before Froyo we need to construct the external cache dir ourselves final String cacheDir = "/Android/data/" + context.getPackageName() + "/cache/"; return new File(Environment.getExternalStorageDirectory().getPath() + cacheDir); } public static boolean hasExternalCacheDir() { return Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.FROYO; } } </code></pre> <p>Remember to put </p> <pre><code>&lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&gt; </code></pre> <p>on your AndroidManifest.xml</p> <p>I figured out this way by reading <a href="http://grepcode.com/file_/repo1.maven.org/maven2/com.integralblue/httpresponsecache/1.0.0/com/integralblue/httpresponsecache/compat/libcore/net/http/HttpResponseCache.java/?v=source" rel="noreferrer">this code</a> and the javadoc from Jake Wharton's DiskLruCache</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload