天天看點

Android網絡圖檔加載緩存處理庫的使用

課程背景:

在 APP 開發中,網絡圖檔的處理和加載是非常重要的一部分,圖檔處理如果做的不好會導緻 OOM 及 APP 體驗卡頓不流暢。是以本課程将會通過兩個目前比較強大的圖檔處理庫幫助大家學習圖檔處理這部分。

核心内容:

1.Android 主流網絡圖檔加載緩存庫架構 Android-Universal-ImageLoader 和 Picasso 的各自特點和優勢

2.Android-Universal-ImageLoader 的用法和案例

3.Picasso 的用法和案例

課程概要

  • 網絡圖檔加載庫的特點及優勢
  • Universal-ImageLoader的用法和案例
  • Picasso的用法和案例

網絡圖檔加載庫的特點及優勢

Android中圖檔處理存在的難點:

• OOM記憶體溢出

• 圖檔尺寸和縮略圖處理的平衡

• 網絡圖檔的加載與緩存機制

這裡将會選擇兩款比較優秀的開源圖檔處理庫架構:Universal-ImageLoader和Picasso為大家進行講解。

Universal-ImageLoader的簡介和特點:

Universal-ImageLoader是目前Android主流的圖檔處理庫架構之一,作者是白俄羅斯的Sergey Tarasevich。

在Android圖檔進行中需要考慮的問題很多,例如OOM、圖檔緩存和網絡圖檔加載、多線程問題及圖檔壓縮處理等等複雜的問題。但是Universal-ImageLoader已經幫我們把這些問題處理好了,對外提供了相應的完善的請求API,我們隻需要按照要求使用即可。

Universal-ImageLoader特點:

• 支援本地圖檔和網絡圖檔的多線程異步加載和緩存處理

• 個性化的配置自己項目的ImageLoader

• 圖檔加載過程的監聽回調

• 自動對加載的圖檔針對目前剩餘記憶體進行裁剪優化,防止OOM

• 較好的控制圖檔的加載過程,例如暫停圖檔加載,重新開始加載圖檔

缺點:沒有對本地檔案壓縮處理的相關API方法以及預設都是Src模式設定圖檔,沒有針對Background屬性開放API。

Picasso的簡介和特點

Picasso是Square公司開源的一個Android圖形緩存庫。可以實作圖檔下載下傳和緩存功能。

特點:

• 加載載網絡或本地圖檔并自動緩存處理

• 鍊式調用

• 圖形轉換操作,如變換大小,旋轉等,提供了接口來讓使用者可以自定義轉換操作

• 在Adapter中回收和取消目前的下載下傳功能

總結:

• 都有高效的網絡圖檔下載下傳和緩存性能

• Universal-ImageLoader功能多,靈活使用配置

• Picasso使用複雜的圖檔壓縮轉換來盡可能的減少記憶體消耗

• 在Adapter中需要取消已經不在視野範圍的ImageView圖檔資源的加載,否則會導緻圖檔錯位,Picasso已經解決了這個問題。

Universal-ImageLoader的用法和案例

本課時主要介紹Universal-ImageLoader的用法,包含以下幾個知識點:

• Universal-ImageLoader的配置

• 用Universal-ImageLoader加載網絡圖檔和本地圖檔

Universal-ImageLoader的配置

可以全局配置:在Application裡進行配置。

可以針對單一加載圖檔的地方配置。

例如:可配置圖檔緩存儲存路徑、線程池内加載的數量、緩存的檔案數量 、每個緩存檔案的最大長寬、加載過程中和加載失敗時顯示的圖檔等等。

用Universal-ImageLoader加載網絡圖檔和本地圖檔

Universal-ImageLoader支援網絡圖檔的加載和本地圖檔的加載,而且可以自動緩存、自動根據目前手機環境進行壓縮處理防止出現OOM。

也可以監聽整個圖檔的加載過程,可控。

接下來通過一個執行個體講解這兩個知識點(Universal-ImageLoader的配置和用Universal-ImageLoader加載網絡圖檔和本地圖檔)

先将universal-image-loader-1.9.3.jar這個jar包拷貝到項目中,Universal-ImageLoader的配置一般都使用全局的配置是以将配置放到Application中(以下是一個自定義的Application将配置資訊寫到裡面)

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
                this)
                .memoryCacheExtraOptions(, )
                // max width, max height,即儲存的每個緩存檔案的最大長寬
                .discCacheExtraOptions(, , null)
                // 儲存到硬碟的每個緩存檔案的最大長寬
                // Can slow ImageLoader, use it carefully (Better don't use
                // it)/設定緩存的詳細資訊,最好不要設定這個
                .threadPoolSize()
                // 線程池内加載的數量
                .threadPriority(Thread.NORM_PRIORITY - )
                .denyCacheImageMultipleSizesInMemory()
                .memoryCache(new UsingFreqLimitedMemoryCache( *  * ))
                // You can pass your own memory cache
                // implementation/你可以通過自己的記憶體緩存實作
                .memoryCacheSize( *  * )
                .discCacheSize( *  * )
                .discCacheFileNameGenerator(new Md5FileNameGenerator())
                // 将儲存的時候的URI名稱用MD5 加密
                .tasksProcessingOrder(QueueProcessingType.LIFO)
                .discCacheFileCount()
                // 緩存的檔案數量
                .discCache(
                        new UnlimitedDiscCache(new File(Environment
                                .getExternalStorageDirectory()
                                + "/myApp/imgCache")))
                // 自定義緩存路徑
                .defaultDisplayImageOptions(getDisplayOptions())
                // 加載圖檔的一個預設配置資訊
                .imageDownloader(
                        new BaseImageDownloader(this,  * ,  * ))
                //圖檔加載過程中的配置30 * 1000加載逾時的時間 5 * 1000連接配接時間
                .writeDebugLogs() // Remove for release app
                // 寫入加載的錯誤日志
                .build();// 開始建構
        ImageLoader.getInstance().init(config);
    }

    private DisplayImageOptions getDisplayOptions() {
        DisplayImageOptions options;
        options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.drawable.ic_launcher) // 設定圖檔在下載下傳期間顯示的圖檔
                .showImageForEmptyUri(R.drawable.ic_launcher)// 設定圖檔Uri為空或是錯誤的時候顯示的圖檔
                .showImageOnFail(R.drawable.ic_launcher) // 設定圖檔加載/解碼過程中錯誤時候顯示的圖檔
                .cacheInMemory(true)// 設定下載下傳的圖檔是否緩存在記憶體中
                .cacheOnDisc(true)// 設定下載下傳的圖檔是否緩存在SD卡中
                .considerExifParams(true) // 是否考慮JPEG圖像EXIF參數(旋轉,翻轉)
                .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)// 設定圖檔以如何的編碼方式顯示
                .bitmapConfig(Bitmap.Config.RGB_565)// 設定圖檔的解碼類型//
                // .delayBeforeLoading(int delayInMillis)//int
                // delayInMillis為你設定的下載下傳前的延遲時間
                // 設定圖檔加入緩存前,對bitmap進行設定
                // .preProcessor(BitmapProcessor preProcessor)
                .resetViewBeforeLoading(true)// 設定圖檔在下載下傳前是否重置,複位
                .displayer(new RoundedBitmapDisplayer())// 是否設定為圓角,弧度為多少
                .displayer(new FadeInBitmapDisplayer())// 是否圖檔加載好後漸入的動畫時間
                .build();// 建構完成
        return options;
    }
}
           

在ImageLoaderConfiguration 的配置中可以不要把所有的配置資訊都寫完,根據需要把幾個重要的配置上就行,接下來用Universal-ImageLoader加載網絡圖檔和本地圖檔。

public class MainActivity extends Activity {
    private ImageLoader loader;
    private ImageView iv_img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        loader = ImageLoader.getInstance();
        iv_img = (ImageView) this.findViewById(R.id.iv_img);
        String uri = "file:///" + "本地路徑";
//      loader.displayImage(
//              "http://s1.jikexueyuan.com/current/static/images/logo.png",
//              iv_img);
        loader.displayImage(
                "http://s1.jikexueyuan.com/current/static/images/logo.png",
                iv_img, new ImageLoadingListener() {

                    @Override
                    public void onLoadingStarted(String arg0, View arg1) {
                        Log.i("info", "onLoadingStarted");
                    }

                    @Override
                    public void onLoadingFailed(String arg0, View arg1,
                            FailReason arg2) {
                        Log.i("info", "onLoadingFailed");
                    }

                    @Override
                    public void onLoadingComplete(String arg0, View arg1,
                            Bitmap arg2) {
                        Log.i("info", "onLoadingComplete");
                    }

                    @Override
                    public void onLoadingCancelled(String arg0, View arg1) {
                        Log.i("info", "onLoadingCancelled");
                    }
                });
    }

}
           

注:測試記得加入網絡通路權限和SDCard的讀寫權限

Picasso的用法和案例

本課時主要介紹Async-http的用法,包含以下幾個知識點:

• Picasso的幾個重要方法的介紹

• 用Picasso加載網絡圖檔和本地圖檔

Picasso的幾個重要方法的介紹

圖檔異步加載:

Picasso.with(context).load(“http://baidu.com/logo.png“).into(imageView);

圖檔轉換:轉換圖檔以适應布局大小并減少記憶體占用

Picasso.with(context).load(url).resize(50,50) .centerCrop() .into(imageView);

Adapter 中的下載下傳:Adapter的重用會被自動檢測到,Picasso會取消上次的加載

空白或者錯誤占位圖檔設定方法及本地資源檔案的加載方法

用Picasso加載網絡圖檔和本地圖檔

Picasso采用鍊式調用加載和處理圖檔方式。

除了加載網絡圖檔,picasso還支援加載Resources, assets, files, contentproviders中的本地資源檔案。

接下來通過執行個體講解這兩個知識點(Picasso的幾個重要方法的介紹和用Picasso加載網絡圖檔和本地圖檔)

将picasso-2.4.0.jar拷貝到項目中,到AndroidManifest.xml中配置相關的權限

public class MainActivity extends Activity {
    private ImageView iv_img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv_img = (ImageView) this.findViewById(R.id.iv_img);
        Picasso.with(this)
                .load("http://s1.jikexueyuan.com/current/static/images/logo.png")
                .into(iv_img);
        Picasso.with(this)
                .load("http://s1.jikexueyuan.com/current/static/images/logo.png")
                .resize(, ).into(iv_img);
        Picasso.with(this)
                .load("http://s1.jikexueyuan.com/current/static/images/logo.png")
                .error(R.drawable.ic_launcher).into(iv_img);
    }
}
           

本套課程中我們學習了2款Android網絡圖檔加載緩存處理庫的使用,你應當掌握了以下知識:

• 兩款圖檔處理庫的特點和不同

• Universal-ImageLoader基礎用法

• Picasso的基礎用法

你可以使用這些技術來制作一個基于圖檔相關的App,如果想繼續提高,你可以繼續研究相關的拓展方法。