日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android网络图片加载缓存处理库的使用---第三方库学习笔记(五)

發(fā)布時(shí)間:2023/12/20 Android 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android网络图片加载缓存处理库的使用---第三方库学习笔记(五) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

兩款比較優(yōu)秀的開源圖片處理庫框架:Universal-ImageLoader和Picasso。

Universal-ImageLoader

簡介:
Universal-ImageLoader是目前Android主流的圖片處理庫框架之一,作者是白俄羅斯的Sergey Tarasevich。
在Android圖片處理中需要考慮的問題很多,例如OOM(內(nèi)存溢出)、圖片緩存和網(wǎng)絡(luò)圖片加載、多線程問題及圖片壓縮處理等等復(fù)雜的問題。但是Universal-ImageLoader已經(jīng)幫我們把這些問題處理好了,對外提供了相應(yīng)的完善的請求API,我們只需要按照要求使用即可。

特點(diǎn):

  • 支持本地圖片和網(wǎng)絡(luò)圖片的多線程異步加載和緩存處理
  • 個(gè)性化的配置自己項(xiàng)目的ImageLoader
  • 圖片加載過程的監(jiān)聽回調(diào)
  • 自動(dòng)對加載的圖片針對當(dāng)前剩余內(nèi)存進(jìn)行裁剪優(yōu)化,防止OOM
  • 較好的控制圖片的加載過程,例如暫停圖片加載,重新開始加載圖片
  • 缺點(diǎn):
    沒有對本地文件壓縮處理的相關(guān)API方法以及默認(rèn)都是Src模式設(shè)置圖片,沒有針對Background屬性開放API。

    Universal-ImageLoader的用法:

    1.Universal-ImageLoader的配置
    可以全局配置:在Application里進(jìn)行配置
    可以針對單一加載圖片的地方配置

    例如:可配置圖片緩存保存路徑、線程池內(nèi)加載的數(shù)量、緩存的文件數(shù)量 、每個(gè)緩存文件的最大長寬、加載過程中和加載失敗時(shí)顯示的圖片等等。

    2.用Universal-ImageLoader加載網(wǎng)絡(luò)圖片和本地圖片
    Universal-ImageLoader支持網(wǎng)絡(luò)圖片的加載和本地圖片的加載,而且可以自動(dòng)緩存、自動(dòng)根據(jù)當(dāng)前手機(jī)環(huán)境進(jìn)行壓縮處理防止出現(xiàn)OOM。
    也可以監(jiān)聽整個(gè)圖片的加載過程,可控。

    代碼:
    MyApplication類:

    package com.test.imageloader;import java.io.File;import android.app.Application; import android.graphics.Bitmap; import android.os.Environment;import com.example.imageloaderandpicasso.R; import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache; import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator; import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import com.nostra13.universalimageloader.core.assist.ImageScaleType; import com.nostra13.universalimageloader.core.assist.QueueProcessingType; import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer; import com.nostra13.universalimageloader.core.download.BaseImageDownloader;/*** ImageLoader的全局配置* @author Administrator**/ public class MyApplication extends Application{@Overridepublic void onCreate() {super.onCreate();ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this).memoryCacheExtraOptions(480, 800)// max width, max height,即保存的每個(gè)緩存文件的最大長寬.discCacheExtraOptions(480, 800, null)// Can slow ImageLoader, use it carefully (Better don't use// it)/設(shè)置緩存的詳細(xì)信息,最好不要設(shè)置這個(gè).threadPoolSize(3)// 線程池內(nèi)加載的數(shù)量.threadPriority(Thread.NORM_PRIORITY - 2).denyCacheImageMultipleSizesInMemory().memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024))// You can pass your own memory cache// implementation/你可以通過自己的內(nèi)存緩存實(shí)現(xiàn).memoryCacheSize(2 * 1024 * 1024).discCacheSize(50 * 1024 * 1024).discCacheFileNameGenerator(new Md5FileNameGenerator())// 將保存的時(shí)候的URI名稱用MD5 加密.tasksProcessingOrder(QueueProcessingType.LIFO).discCacheFileCount(100)// 緩存的文件數(shù)量.discCache(new UnlimitedDiscCache(new File(Environment.getExternalStorageDirectory()+ "/myApp/imgCache")))// 自定義緩存路徑.defaultDisplayImageOptions(getDisplayOptions()).imageDownloader(new BaseImageDownloader(this, 5 * 1000, 30 * 1000)).writeDebugLogs() // Remove for release app.build();// 開始構(gòu)建ImageLoader.getInstance().init(config);}private DisplayImageOptions getDisplayOptions() {DisplayImageOptions options;options = new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.ic_launcher) // 設(shè)置圖片在下載期間顯示的圖片.showImageForEmptyUri(R.drawable.ic_launcher)// 設(shè)置圖片Uri為空或是錯(cuò)誤的時(shí)候顯示的圖片.showImageOnFail(R.drawable.ic_launcher) // 設(shè)置圖片加載/解碼過程中錯(cuò)誤時(shí)候顯示的圖片.cacheInMemory(true)// 設(shè)置下載的圖片是否緩存在內(nèi)存中.cacheOnDisc(true)// 設(shè)置下載的圖片是否緩存在SD卡中.considerExifParams(true) // 是否考慮JPEG圖像EXIF參數(shù)(旋轉(zhuǎn),翻轉(zhuǎn)).imageScaleType(ImageScaleType.EXACTLY_STRETCHED)// 設(shè)置圖片以如何的編碼方式顯示.bitmapConfig(Bitmap.Config.RGB_565)// 設(shè)置圖片的解碼類型//// .delayBeforeLoading(int delayInMillis)//int// delayInMillis為你設(shè)置的下載前的延遲時(shí)間// 設(shè)置圖片加入緩存前,對bitmap進(jìn)行設(shè)置// .preProcessor(BitmapProcessor preProcessor).resetViewBeforeLoading(true)// 設(shè)置圖片在下載前是否重置,復(fù)位.displayer(new RoundedBitmapDisplayer(20))// 是否設(shè)置為圓角,弧度為多少.displayer(new FadeInBitmapDisplayer(100))// 是否圖片加載好后漸入的動(dòng)畫時(shí)間.build();// 構(gòu)建完成return options;}}

    MainActivity類:

    package com.test.imageloader;import android.app.Activity; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.View; import android.widget.ImageView;import com.example.imageloaderandpicasso.R; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;public class MainActivity extends Activity {private ImageLoader loader;private ImageView imageView;// 網(wǎng)絡(luò)圖片uriprivate String uri1 = "http://a.hiphotos.baidu.com/zhidao/pic/item/95eef01f3a292df58099afa6bd315c6034a8732e.jpg";// 本地圖片uri(格式:"file:///"+"本地路徑")private String uri2 = "file:///" + Environment.getExternalStorageDirectory()+"/DCIM/Camera/IMG20150502151010.jpg";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();loaderImage();}//加載圖片的方法private void loaderImage() {loader = ImageLoader.getInstance();// 調(diào)用之前在MyApplication中的配置信息對ImageLoader進(jìn)行實(shí)例化// 將uri中的圖片賦給圖片控件ImageView // loader.displayImage(uri1, imageView);loader.displayImage(uri1, imageView, new ImageLoadingListener() {@Override//加載開始public void onLoadingStarted(String arg0, View arg1) {Log.i("tag", "onLoadingStarted");}@Override//加載失敗public void onLoadingFailed(String arg0, View arg1, FailReason arg2) {Log.i("tag", "onLoadingFailed");}@Override//加載完成public void onLoadingComplete(String arg0, View arg1, Bitmap arg2) {Log.i("tag", "onLoadingComplete");}@Override//加載取消public void onLoadingCancelled(String arg0, View arg1) {Log.i("tag", "onLoadingCancelled");}});}private void initView() {imageView = (ImageView) findViewById(R.id.imageView);} }

    運(yùn)行結(jié)果:

    Picasso

    簡介:
    Picasso是Square公司開源的一個(gè)Android圖形緩存庫。可以實(shí)現(xiàn)圖片下載和緩存功能。

    特點(diǎn):

  • 加載載網(wǎng)絡(luò)或本地圖片并自動(dòng)緩存處理
  • 鏈?zhǔn)秸{(diào)用
  • 圖形轉(zhuǎn)換操作,如變換大小,旋轉(zhuǎn)等,提供了接口來讓用戶可以自定義轉(zhuǎn)換操作
  • 在Adapter中回收和取消當(dāng)前的下載功能
  • Picasso的用法:

    1, Picasso的幾個(gè)重要方法的介紹

    圖片異步加載:
    Picasso.with(context).load(“http://baidu.com/logo.png“).into(imageView);

    圖片轉(zhuǎn)換:轉(zhuǎn)換圖片以適應(yīng)布局大小并減少內(nèi)存占用
    Picasso.with(context).load(url).resize(50, 50) .centerCrop() .into(imageView);

    Adapter 中的下載:Adapter的重用會(huì)被自動(dòng)檢測到,Picasso會(huì)取消上次的加載

    空白或者錯(cuò)誤占位圖片設(shè)置方法及本地資源文件的加載方法

    2, 用Picasso加載網(wǎng)絡(luò)圖片和本地圖片

    Picasso采用鏈?zhǔn)秸{(diào)用加載和處理圖片方式。

    除了加載網(wǎng)絡(luò)圖片,picasso還支持加載Resources, assets, files, content providers中的本地資源文件。

    代碼:

    package com.test.picasso;import android.app.Activity; import android.os.Bundle; import android.widget.ImageView;import com.example.imageloaderandpicasso.R; import com.squareup.picasso.Picasso;public class PicassoTest extends Activity{private ImageView imageView;private String path = "http://auto.2500sz.com/auto/tpxw/hcsx/images/2011/8/27/94E17498DB894552AD046339C6FF611A.jpg";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_picasso);initView();//Picasso加載網(wǎng)絡(luò)圖片,并綁定ImageView控件Picasso.with(this).load(path).into(imageView);//對加載的圖片進(jìn)行圖片的處理(設(shè)置加載后的圖片的寬和高) // Picasso.with(this).load(path).resize(100, 100).into(imageView);//設(shè)置當(dāng)加載出錯(cuò)時(shí)調(diào)用默認(rèn)的圖片 // Picasso.with(this).load(path).error(R.drawable.ic_launcher).into(imageView);}private void initView() {imageView = (ImageView) findViewById(R.id.imageView);}}

    運(yùn)行結(jié)果截圖:

    總結(jié):

  • 都有高效的網(wǎng)絡(luò)圖片下載和緩存性能
  • Universal-ImageLoader功能多,靈活使用配置
  • Picasso使用復(fù)雜的圖片壓縮轉(zhuǎn)換來盡可能的減少內(nèi)存消耗
  • 在Adapter中需要取消已經(jīng)不在視野范圍的ImageView圖片資源的加載,否則會(huì)導(dǎo)致圖片錯(cuò)位,Picasso已經(jīng)解決了這個(gè)問題。
  • 一個(gè)簡單的加載本地相冊的圖片的實(shí)例:
    代碼:(其中用到了兩種方法加載本地相冊的圖片,1.使用android自帶的SDK加載 2.獲取到本地相冊圖片的路徑后,通過ImageLoader加載圖片)

    package com.test.imageloader;import java.io.FileNotFoundException; import java.io.IOException;import android.app.Activity; import android.content.ContentResolver; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.Matrix; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView;import com.example.imageloaderandpicasso.R; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;public class MainActivity extends Activity {private static final int CHOOSE_PICTURE = 111;private static final int SCALE = 2;private ImageLoader loader;private ImageView imageView;private Button button;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();setListener();}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK) {switch (requestCode) {case CHOOSE_PICTURE:// 照片的原始資源地址Uri originalUri = data.getData();// 方式一:// openPhoto(originalUri);// 方式二:String path = getPhotoPath(originalUri);String uri = "file:///" + path;loaderImage(uri);break;default:break;}}}// 打開相冊的圖片private void openPhoto(Uri uri) {try {ContentResolver resolver = getContentResolver();// 使用ContentProvider通過URI獲取原始圖片Bitmap photo = MediaStore.Images.Media.getBitmap(resolver, uri);if (photo != null) {// 為防止原始圖片過大導(dǎo)致內(nèi)存溢出,這里先縮小原圖顯示,然后釋放原始Bitmap占用的內(nèi)存Bitmap smallBitmap = zoomBitmap(photo,photo.getWidth() / SCALE, photo.getHeight() / SCALE);// 釋放原始圖片占用的內(nèi)存,防止out of memory異常發(fā)生photo.recycle();imageView.setImageBitmap(smallBitmap);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}// 獲取在相冊中選中的圖片的路徑private String getPhotoPath(Uri uri) {String[] proj = { MediaStore.Images.Media.DATA };// 好像是android多媒體數(shù)據(jù)庫的封裝接口,具體的看Android文檔Cursor cursor = managedQuery(uri, proj, null, null, null);// 按我個(gè)人理解 這個(gè)是獲得用戶選擇的圖片的索引值int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);// 將光標(biāo)移至開頭 ,這個(gè)很重要,不小心很容易引起越界cursor.moveToFirst();// 最后根據(jù)索引值獲取圖片路徑String path = cursor.getString(column_index);return path;}private void initView() {imageView = (ImageView) findViewById(R.id.imageView);button = (Button) findViewById(R.id.button);}private void setListener() {button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent openAlbumIntent = new Intent(Intent.ACTION_GET_CONTENT);openAlbumIntent.setType("image/*");startActivityForResult(openAlbumIntent, CHOOSE_PICTURE);}});}// 加載圖片的方法private void loaderImage(String uri) {loader = ImageLoader.getInstance();// 調(diào)用之前在MyApplication中的配置信息對ImageLoader進(jìn)行實(shí)例化// 將uri中的圖片賦給圖片控件ImageView// loader.displayImage(uri1, imageView);loader.displayImage(uri, imageView, new ImageLoadingListener() {@Override// 加載開始public void onLoadingStarted(String arg0, View arg1) {Log.i("tag", "onLoadingStarted");}@Override// 加載失敗public void onLoadingFailed(String arg0, View arg1, FailReason arg2) {Log.i("tag", "onLoadingFailed");}@Override// 加載完成public void onLoadingComplete(String arg0, View arg1, Bitmap arg2) {Log.i("tag", "onLoadingComplete");}@Override// 加載取消public void onLoadingCancelled(String arg0, View arg1) {Log.i("tag", "onLoadingCancelled");}});}/** 縮放Bitmap圖片 **/public Bitmap zoomBitmap(Bitmap bitmap, int width, int height) {int w = bitmap.getWidth();int h = bitmap.getHeight();Matrix matrix = new Matrix();float scaleWidth = ((float) width / w);float scaleHeight = ((float) height / h);matrix.postScale(scaleWidth, scaleHeight);// 利用矩陣進(jìn)行縮放不會(huì)造成內(nèi)存溢出Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);return newbmp;} }

    運(yùn)行效果:

    總結(jié)

    以上是生活随笔為你收集整理的Android网络图片加载缓存处理库的使用---第三方库学习笔记(五)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。