Alan Moment
  • Introduction
  • 智慧家庭
    • Fibaro 系統整合便宜的 IP Cam
  • Life
    • 用AWS Glacier做最後的冷資料備份
    • 如何在macOS修改影音檔日期
  • 3D Printer
    • Atom2.5EX 之血淚組裝
    • 列印經驗紀錄
      • SpoolHolder
    • 製圖經驗
      • Turntable
      • 重製Atom3散熱風扇
    • 線材經驗
      • PETG
        • 首測
  • Kubernetes
    • 使用Kops建立Kubernetes
    • 使用HelmV2
    • Kubernetes的技術問題排解技巧
  • PHP
    • 管理PHP Library的利器Composer
    • PHP安裝JSON
    • Phalcon首發
    • Gearman Job Worker for PHP
    • Laravel 首發 !!!
    • Data Encrypt & Decrypt
  • Python
    • Django + Python 開發環境建置
  • Android
    • Android zipcode library of maven
    • Android use foreign object of OrmLite
    • ProgressBar while loading ListView of Android
    • AsyncTask download image by the Android
    • Use Thread control Android UI
    • Android Universal Image Loader
  • Ruby on Rails
    • Install rmagick on the Windows of Ruby on Rails
    • Ruby on Rails deploy on Heroku
    • Ruby on Rails 小問題
  • React
    • Ditched AngularJS for React
  • Tessel
    • 很潮的 Tessel
    • Connect to Slack on Tessel
    • Baby Help on Tessel
  • Node.js
    • CentOS 安装 Node.js 0.8.5
  • OOAD
    • Injection Principle Design Pattern
  • Linux
    • SSH免密碼登入遠端電腦
    • Apache與Tomcat的結合
    • The bash auto build
  • Hadoop
    • CentOS 5.5 + Hadoop 0.20
    • CentOS 5.5 + Hbase 0.94.8
    • Hadoop + Hbase 叢集環境
    • Hadoop 溝通橋梁之 Thrift 0.7
    • 使用MapReduce之替代方案Hive
    • 使用Sqoop將MySQL資料匯入Hbase
  • Database
    • 吃足苦頭的Mssql
  • IDE
    • Netbeans console中文亂碼解決方法
    • 用NetBeans開發Ruby On Rails
  • Agile
    • 淺談我的Agile
  • 協作工具
    • 建置專屬自己的Github之Gitlab
    • Gitlab 4.1 upgrade to Gitlab 6.0超偷懶方法
    • Install Phabricator and run on the Gitlab
    • Phabricator 基本應用
    • Phabricator review code應用
    • Redmine之基本建置與Scrum應用
    • Omnibus Gitlab 7 基礎操作
    • Git Push Notify to Slack on Gitlab
    • phabricator-extensions-Sprint 無法抓到正確的 Story Points
  • 其他
    • 慶祝Octopress開張
    • 走在時尚的尖端! Ghost
    • 大搬家
    • 網頁教學初體驗
    • 網路攻擊很猖狂
Powered by GitBook
On this page
  • Gradle
  • Usage

Was this helpful?

  1. Android

Android Universal Image Loader

PreviousUse Thread control Android UINextRuby on Rails

Last updated 3 years ago

Was this helpful?

開發了一陣子的 Android,一開始著墨在功能是否能正常運作,現在注重的地方在校能,因為常發生閃退,或未知的錯誤,這邊要講一下下載遠端的圖片加強版。

繼上次發表,這一篇發現了其中有些問題。若是大量的圖片,會產生大量的 AsyncTask,會造成閃退,以及其他的 AsyncTask 無法運作,所以有個工具是,它已經幫使用者處理這部份的問題了,使用起來也很簡單。也不會有 AsyncTask 阻塞的問題。

Gradle

有兩種方式載入 jar 檔

  1. 官網下載 jar 檔放進 libs,在 build.gradle 的 dependencies 中建立compile files('libs/universal-image-loader-1.8.6.jar')

  2. 自動下載,在 build.gradle 的 dependencies 中建立 compile 'com.nostra13.universalimageloader:universal-image-loader:1.8.6'

Usage

我自己寫一隻方便使用的 Base

/**
* ImageLoader Base
*
* @author Alan
* @since 2013/09/06
*/
public class BaseImageLoader {

  private static ImageLoader imageLoader;
  private static DisplayImageOptions options;

  private String path = "loader_cache";
  private int stubImage = R.drawable.default;
  private int emptyImage = R.drawable.default;
  private int failImage = R.drawable.default;
  private int fadeInTimestamp = 500;

  public BaseImageLoader(Context context) {
    File cacheDir = StorageUtils.getOwnCacheDirectory(context, path);
    imageLoader = com.nostra13.universalimageloader.core.ImageLoader.getInstance();
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
            .discCache(new UnlimitedDiscCache(cacheDir)) // 存在SDcard
            .discCacheFileNameGenerator(new HashCodeFileNameGenerator())
            .discCacheExtraOptions(480, 800, Bitmap.CompressFormat.JPEG, 75, null)
            .discCacheSize(50 * 1024 * 1024) // 快取圖片尺寸
            .discCacheFileCount(100) // 快取數量
            .build();
    imageLoader.init(config);
  }

  public void setPath(String path) {
    this.path = path;
  }

  public void setStubImage(int stubImage) {
    this.stubImage = stubImage;
  }

  public void setEmptyImage(int emptyImage) {
    this.emptyImage = emptyImage;
  }

  public void setFailImage(int failImage) {
    this.failImage = failImage;
  }

  /**
  * 清除暫存檔
  */
  public void clear() {
    imageLoader.clearDiscCache();
    imageLoader.clearMemoryCache();
  }

  public ImageLoader getImageLoader() {
    return imageLoader;
  }

  public DisplayImageOptions getOptions() {
    options = new DisplayImageOptions.Builder()
              .showStubImage(stubImage) // 載入中顯示的圖片
              .showImageForEmptyUri(emptyImage) // 找不到連結或是錯誤顯示的圖片
              .showImageOnFail(failImage) // 圖片解碼錯誤顯示的圖片
              .imageScaleType(ImageScaleType.EXACTLY) // 圖片縮放方式
              .cacheInMemory(true)
              .cacheOnDisc(true)
              //.displayer(new RoundedBitmapDisplayer(20)) // 載入的圖片加工圓角
              .displayer(new FadeInBitmapDisplayer(fadeInTimestamp)) // 設置圖片漸顯的時間
              //.displayer(new SimpleBitmapDisplayer()) // 正常顯示一張圖片
              .build();
    return options;
  }
}

有了這隻 Base 的在外面呼叫只需要

// 建立Base物件
BaseImageLoader baseImageLoader = new BaseImageLoader(this);

// 顯示圖片
ImageView image = (ImageView) convertView.findViewById(R.id.photo);
baseImageLoader.getImageLoader().displayImage(item.getCover(), image, baseImageLoader.getOptions());

打完收工。用了這個套件,我一次下載幾千張圖片,都不會有閃退的情況了。而且它有很多特性非常方便,諸如圖片圓角、載入中的顯示、找不到圖片的顯示等等,我只列出我需要用到的。

Nov 28th, 2013 4:19:00pm

AsyncTask Download Image by the Android
Android-Universal-Image-Loader