兩款比較優(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).discCacheExtraOptions(
480,
800,
null).threadPoolSize(
3).threadPriority(Thread.NORM_PRIORITY -
2).denyCacheImageMultipleSizesInMemory().memoryCache(
new UsingFreqLimitedMemoryCache(
2 *
1024 *
1024)).memoryCacheSize(
2 *
1024 *
1024).discCacheSize(
50 *
1024 *
1024).discCacheFileNameGenerator(
new Md5FileNameGenerator()).tasksProcessingOrder(QueueProcessingType.LIFO).discCacheFileCount(
100).discCache(
new UnlimitedDiscCache(
new File(Environment.getExternalStorageDirectory()+
"/myApp/imgCache"))).defaultDisplayImageOptions(getDisplayOptions()).imageDownloader(
new BaseImageDownloader(
this,
5 *
1000,
30 *
1000)).writeDebugLogs() .build();ImageLoader.getInstance().init(config);}
private DisplayImageOptions
getDisplayOptions() {DisplayImageOptions options;options =
new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.ic_launcher) .showImageForEmptyUri(R.drawable.ic_launcher).showImageOnFail(R.drawable.ic_launcher) .cacheInMemory(
true).cacheOnDisc(
true).considerExifParams(
true) .imageScaleType(ImageScaleType.EXACTLY_STRETCHED).bitmapConfig(Bitmap.Config.RGB_565).resetViewBeforeLoading(
true).displayer(
new RoundedBitmapDisplayer(
20)).displayer(
new FadeInBitmapDisplayer(
100)).build();
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;
private String uri1 =
"http://a.hiphotos.baidu.com/zhidao/pic/item/95eef01f3a292df58099afa6bd315c6034a8732e.jpg";
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();
loader.displayImage(uri1, imageView,
new ImageLoadingListener() {
@Overridepublic void onLoadingStarted(String arg0, View arg1) {Log.i(
"tag",
"onLoadingStarted");}
@Overridepublic void onLoadingFailed(String arg0, View arg1, FailReason arg2) {Log.i(
"tag",
"onLoadingFailed");}
@Overridepublic void onLoadingComplete(String arg0, View arg1, Bitmap arg2) {Log.i(
"tag",
"onLoadingComplete");}
@Overridepublic 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.with(
this).load(path).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();String path = getPhotoPath(originalUri);String uri =
"file:///" + path;loaderImage(uri);
break;
default:
break;}}}
private void openPhoto(Uri uri) {
try {ContentResolver resolver = getContentResolver();Bitmap photo = MediaStore.Images.Media.getBitmap(resolver, uri);
if (photo !=
null) {Bitmap smallBitmap = zoomBitmap(photo,photo.getWidth() / SCALE, photo.getHeight() / SCALE);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 };Cursor cursor = managedQuery(uri, proj,
null,
null,
null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);cursor.moveToFirst();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();loader.displayImage(uri, imageView,
new ImageLoadingListener() {
@Overridepublic void onLoadingStarted(String arg0, View arg1) {Log.i(
"tag",
"onLoadingStarted");}
@Overridepublic void onLoadingFailed(String arg0, View arg1, FailReason arg2) {Log.i(
"tag",
"onLoadingFailed");}
@Overridepublic void onLoadingComplete(String arg0, View arg1, Bitmap arg2) {Log.i(
"tag",
"onLoadingComplete");}
@Overridepublic 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);Bitmap newbmp = Bitmap.createBitmap(bitmap,
0,
0, w, h, matrix,
true);
return newbmp;}
}
運(yùn)行效果:
總結(jié)
以上是生活随笔為你收集整理的Android网络图片加载缓存处理库的使用---第三方库学习笔记(五)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。