android使用ImageLoader實現圖片緩存(安卓開發必備)


 相信大家在學習以及實際開發中基本都會與網絡數據打交道,而這其中一個非常影響用戶體驗的就是圖片的緩存了,若是沒有弄好圖片緩存,用戶體驗會大大下降,總會出現卡頓情況,而這個問題尤其容易出現在ListView中的Item有圖片的情況中。

前面與大家分享了一個網絡連接框架Retrofit,里面也有類似的圖片加載的picasso,大家都可以去體驗,直通車:http://www.cnblogs.com/liushilin/p/5680135.html

 

當然還有當前我認為最好用的圖片緩存加載框架Fresco,直通車:http://www.cnblogs.com/liushilin/p/5659301.html

大家可能有所不解,為什么有這么好的框架Fresco了,樓主為什么還要分享這個ImageLoader呢?什么鬼。或許大家看法不一樣嘛,總之各有各存在的意義,具體就大家自行甄別咯。

 

項目已同步至:https://github.com/nanchen2251/ImageLoaderDemo

1)先來看看ImageLoader框架的特征。

①多線程下載圖片,圖片可以來源於網絡,文件系統,項目文件夾assets中以及drawable中等

②支持隨意的配置ImageLoader,例如線程池,圖片下載器,內存緩存策略,硬盤緩存策略,圖片顯示選項以及其他的一些配置

③支持圖片的內存緩存,文件系統緩存或者SD卡緩存

④支持圖片下載過程的監聽

⑤根據控件(ImageView)的大小對Bitmap進行裁剪,減少Bitmap占用過多的內存

⑥較好的控制圖片的加載過程,例如暫停圖片加載,重新開始加載圖片,一般使用在ListView,GridView中,滑動過程中暫停加載圖片,停止滑動的時候去加載圖片

⑦提供在較慢的網絡下對圖片進行加載

 

2)然后要使用它,肯定得添加這個支持包,在studio里面支持直接add,搜索Image-loader即可進行網絡添加,需要看它源碼的也可以去github網上gank.

3)先來一個簡單使用,加載一張網絡圖片,只需要兩行代碼,可見其簡單之處。

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout
 3     xmlns:android="http://schemas.android.com/apk/res/android"
 4     xmlns:tools="http://schemas.android.com/tools"
 5     android:layout_width="match_parent"
 6     android:layout_height="match_parent"
 7     tools:context="com.example.nanchen.imageloaderdemo.MainActivity">
 8 
 9     <ImageView 10 android:layout_width="wrap_content" 11 android:layout_height="wrap_content" 12 android:src="@mipmap/ic_launcher" 13 android:id="@+id/main_image" 14 android:layout_centerInParent="true"/> 15 </RelativeLayout>

再看看Activity

package com.example.nanchen.imageloaderdemo;

import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.ImageView; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; public class MainActivity extends AppCompatActivity { private String imageUrl = "http://pic.cnblogs.com/face/845964/20160301162812.png"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView imageView = (ImageView) findViewById(R.id.main_image); ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(this));//初始化完成  ImageLoader.getInstance().displayImage(imageUrl,imageView); } }

由於是訪問網絡圖片,所以別忘了添加網絡權限

<uses-permission android:name="android.permission.INTERNET"/>

  

運行圖:

 

很簡單有木有,不用你去寫網絡訪問,不用你去異步執行,只要兩句話,只要兩句話!!!

 

4)當然,你還可以盡情的設置它,上面只是用了簡單的Default屬性,實際開發中我們可能需要自己按照自己的需求去寫它,這里就設置了加載失敗顯示的圖片,還有對於緩存機制的管理等。

 1 //圖片展示的管理操作
 2         DisplayImageOptions options = new DisplayImageOptions.Builder()
 3                 .cacheInMemory(true) 4 .cacheOnDisk(true) 5 .displayer(new RoundedBitmapDisplayer(20)) 6  .showImageOnFail(R.mipmap.ic_launcher) 7  .bitmapConfig(Bitmap.Config.RGB_565) 8  .build(); 9 10 11 //這樣自定義設置后就可以管理二級緩存和三級緩存了 12 ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this) 13 .memoryCacheSizePercentage(20)//設置占用內存的百分比 14 .diskCacheFileCount(100)//設置最大下載圖片數 15 .diskCacheSize(5 * 1024 * 1024) 16  .defaultDisplayImageOptions(options) 17  .build(); 18 19 ImageLoader.getInstance().init(configuration);//初始化完成 20 ImageLoader.getInstance().displayImage(imageUrl,imageView);

 

這里還有很多其他的屬性啦。

當然其中使用ImageLoader加載網絡圖片並不是只有displayImage這個方法的,只是我覺得這是它的方法中相對簡單的一種了。

它其實還有loadImage(),loadImageSync()兩種方式,loadImageSync()方法是同步的,android4.0有個特性,網絡操作不能在主線程,所以loadImageSync()方法我們就不去使用了。對於另外的方式大家可以自行嘗試,不過我的確很推薦上面的方法了。

4)另外ImageLoader自然也是支持加載sd卡圖片和Content provider等,使用起來也比較簡單,只需要簡單添加兩句話即可

1         String imagePath = "/mnt/sdcard/image.png";
2         String imageUrl = ImageDownloader.Scheme.FILE.wrap(imagePath); 3 4 ImageLoader.getInstance().init(configuration);//初始化完成 5 ImageLoader.getInstance().displayImage(imageUrl,imageView);

5)當然,我相信要使用圖片加載框架,更多的人是用ListView和GridView來顯示大量的圖片,而當我們快速地滑動滾動條的時候,如果同時進行網絡加載的話,我們會發現性能大受迎新,那樣會出現卡頓情況嚴重。所以我們應該在滑動的時候不允許加載圖片,待滑動結束的時候才加載,這個框架自然少不了這個功能,它提供了PauseOnScrollListner.

lv.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));  
gv.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));  

其中的三個參數很簡單,第一個是我們的ImageLoader的實例對象,第二個是boolean型參數,需要停止滑動的時候傳入一個true,第三個參數控制很快速的滑動的時候圖片是否加載。

 

說了這么多,也差不多了,安卓很多東西,你只有去嘗試,你才會知道其中的奧妙,趁年少輕狂,好好搞一波瘋狂。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM