2014-09-22 92 views
14

可以使用通用圖像加載器進行離線嗎? 如果可能,如何使用它? 使用configs? 如何手動設置下載目錄?如何使用通用圖像加載器脫機緩存?

內存不足erroron的加載巨大的圖像:

我的代碼:

DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder() 
      .cacheOnDisc(true).cacheInMemory(true) 
      .imageScaleType(ImageScaleType.IN_SAMPLE_INT) 
      .displayer(new FadeInBitmapDisplayer(300)).build(); 
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(G.appConfigs.context) 
      .defaultDisplayImageOptions(defaultOptions) 
      .memoryCacheExtraOptions(480, 800) // default = device screen dimensions 
      .diskCacheExtraOptions(480, 800, null) 
      .memoryCache(new WeakMemoryCache()) 
      .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) 
      .memoryCacheSize(2 * 1024 * 1024) 
      .discCacheSize(300 * 1024 * 1024) 
      .build(); 
    ImageLoader.getInstance().init(config); 
    // END - UNIVERSAL IMAGE LOADER SETUP 

    ImageLoader imageLoader = ImageLoader.getInstance(); 

     DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true) 
      .cacheOnDisc(true).resetViewBeforeLoading(true) 
      .showImageForEmptyUri(R.drawable.no_pic) 
      .showImageOnFail(R.drawable.load_failed) 
      .showImageOnLoading(R.drawable.img_thumb).build(); 

    //download and display image from url 
    imageLoader.displayImage(imgURL, img, options); 

如何解決呢?

回答

15

您可以使用ImageLoaderConfiguration.Builder類來定製磁盤緩存。這包括方法:

  • diskCacheExtraOptions()
  • diskCacheSize()(以字節計)。
  • diskCacheFileCount()
  • diskCacheFileNameGenerator()
  • 和其他一些人。

或者您可以使用diskCache(DiskCache)來提供實現脫機緩存的自定義類。

從例子中Configuration section of the wiki

File cacheDir = StorageUtils.getCacheDirectory(context); 
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) 
    .memoryCacheExtraOptions(480, 800) // default = device screen dimensions 
    .diskCacheExtraOptions(480, 800, null) 
    .taskExecutor(...) 
    .taskExecutorForCachedImages(...) 
    .threadPoolSize(3) // default 
    .threadPriority(Thread.NORM_PRIORITY - 1) // default 
    .tasksProcessingOrder(QueueProcessingType.FIFO) // default 
    .denyCacheImageMultipleSizesInMemory() 
    .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) 
    .memoryCacheSize(2 * 1024 * 1024) 
    .memoryCacheSizePercentage(13) // default 
    .diskCache(new UnlimitedDiscCache(cacheDir)) // default 
    .diskCacheSize(50 * 1024 * 1024) 
    .diskCacheFileCount(100) 
    .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default 
    .imageDownloader(new BaseImageDownloader(context)) // default 
    .imageDecoder(new BaseImageDecoder()) // default 
    .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default 
    .writeDebugLogs() 
    .build(); 
+0

因此它顯示圖片下線?非常感謝你 – AndroSco 2014-11-10 19:18:28

+0

如果我關閉了應用程序,然後重新啓動它,它會保持緩存的圖像嗎?他們是否堅持使用通用圖像加載程序? – 2014-11-11 20:35:59

+0

@ShobhitPuri這是此功能的目的。 – matiash 2014-11-11 22:11:18

4

但是,如果您重新啓動設備或反正清理緩存的緩存文件將被刪除它不會脫機工作。
要顯示離線圖像,你必須下載SD卡上的圖像到一個特定的文件夾,並在離線情況下必須從那裏選擇。

+0

你的意思是說,如果你遵循@matiash提到的程序,圖像將在重新啓動時被刪除。啊哈!不知道。 – 2014-11-14 06:42:33

+0

是的,嘗試一下。 – Nitesh 2014-11-14 06:49:40

+0

這意味着'Universal Image Loader'不能用於離線存儲圖像。你知道任何可以簡化它的圖書館嗎?其他方面,我將不得不使用AsyncTask並從所有URL下載圖像,並將其存儲在數據庫中或SD卡上的某個位置。我認爲一個圖書館會讓這更容易。 – 2014-11-14 07:01:23

3

不太瞭解這樣的lib。但您可以使用以下方法下載圖像。 只需撥打Async即可。任務並傳遞你的網址。

private File root = Environment.getExternalStorageDirectory(); 
private File dir = new File(root.getAbsolutePath() + "/ImageFolder"); 

private void downloadFile(String url) throws Exception { 
    URL ur = new URL(url); 
    String fileName = url.substring(url.lastIndexOf("/") + 1); 
    File file = new File(dir, fileName); 
    URLConnection uconn = ur.openConnection(); 
    InputStream is = uconn.getInputStream(); 
    BufferedInputStream bufferinstream = new BufferedInputStream(is); 
    ByteArrayBuffer baf = new ByteArrayBuffer(5000); 
    int current = 0; 
    while ((current = bufferinstream.read()) != -1) { 
     baf.append((byte) current); 
    } 
    FileOutputStream fos = new FileOutputStream(file); 
    fos.write(baf.toByteArray()); 
    fos.flush(); 
    fos.close(); 
} 
+0

我想在listview或gridview中使用它,我知道下載方法,我之前做過,但我想用最簡單的方法來解決它。 – AndroSco 2015-02-17 09:58:47

+0

你需要一個永久緩存(離線支持)。 或只是想做一個懶加載。 – Nitesh 2015-02-17 10:06:28

+0

所以我需要listview圖像的永久緩存 – AndroSco 2015-02-17 17:45:32

2

通用圖像加載器是加載異步圖像的完美庫。 您可以使用@matiash答案設置庫配置,然後在

ImageLoader.getInstance().init(config); 

你可以將它們應用到ImageLoader的實例。 之後,如果您的應用程序開始時連接了互聯網,通用圖像加載程序將下載並緩存您使用通用圖像加載程序庫加載這些圖像的所有圖像。下次您加載相同圖像時,通用圖像加載程序將從緩存中獲取它們,這意味着您不需要任何Internet連接(可以脫機工作)。 當有人安裝您的應用程序並嘗試首次使用它時,以及他是否沒有互聯網連接時,問題就出現了。然後通用圖像加載程序會嘗試從網絡服務器加載圖像並將其緩存到存儲設備,但它會失敗,因爲您沒有互聯網連接。這就是爲什麼通用圖像裝載機具有像DisplayImageOptions類:

new DisplayImageOptions.Builder() 

,讓你可以設置當有與您加載圖像的問題會發生什麼。你可以使用這個目的的方法,如:

.showImageOnLoading(R.drawable.default_image) 
.showImageForEmptyUri(R.drawable.default_image) 
.showImageOnFail(R.drawable.default_image) 

下面是一個例子,你如何使用它:)

DisplayImageOptions imageOptions = new DisplayImageOptions.Builder() 
    .showImageOnLoading(getImageLoaderDefaultImage()) 
    .showImageForEmptyUri(getImageLoaderDefaultImage()) 
    .showImageOnFail(getImageLoaderDefaultImage()) 
    .cacheInMemory(true) 
    .cacheOnDisk(true) 
    .considerExifParams(true) 
    .build(); 

方法getImageLoaderDefaultImage(:

private int getImageLoaderDefaultImage(){ return R.drawable.default_img;} 

這裏是如何當你想加載圖像時使用Image Loader:

ImageLoader.getInstance().displayImage("image url", myImageView,imageOptions); 
0

如果您使用的是Xamarin:在OnCreateView中添加代碼或類似代碼也可以在Java中使用。

DisplayImageOptions options = new DisplayImageOptions.Builder().CacheInMemory(true).CacheOnDisk(true).Build(); 
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this.Context).DefaultDisplayImageOptions(options).Build(); 
ImageLoader.Instance.Init(config); 

添加以下代碼,行加載時的圖像

ImageLoader imageLoader = ImageLoader.Instance; 
imageLoader.DisplayImage(imgURL, imageSource); 
相關問題