相信大家在學習以及實際開發中基本都會與網絡數據打交道,而這其中一個非常影響用戶體驗的就是圖片的緩存了,若是沒有弄好圖片緩存,用戶體驗會大大下降,總會出現卡頓情況,而這個問題尤其容易出現在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,第三個參數控制很快速的滑動的時候圖片是否加載。
說了這么多,也差不多了,安卓很多東西,你只有去嘗試,你才會知道其中的奧妙,趁年少輕狂,好好搞一波瘋狂。