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