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

來源:互聯網
上載者:User

標籤:

 相信大家在學習以及實際開發中基本都會與網路資料打交道,而這其中一個非常影響使用者體驗的就是圖片的緩衝了,若是沒有弄好圖片緩衝,使用者體驗會大大下降,總會出現卡頓情況,而這個問題尤其容易出現在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實現圖片緩衝(安卓開發必備)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.