網路下載圖片 imageLoader
官方檔案:
前言:
In short, 網路上很多資訊,稍微講解一下我覺得重要的部分。
我從網路上抓圖片都使用這一套,防止APP oom的好幫手。
為什麼我要自己拉出來做一個Tools呢?這樣不是脫褲子放屁嗎?
為什麼我要自己拉出來做一個Tools呢?這樣不是脫褲子放屁嗎?
因為在一個專案裡面,你一定會大量的用到某些元件,這時候就可以把你重複用到的原件自己封裝成一包寫進Tools內。
ImageLoader也是常用到的一員,就拉出來自己寫在tools內了。
ImageLoader也是常用到的一員,就拉出來自己寫在tools內了。
實作:
在 build.gradle (Module: app) 加上
compile
'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
以下是整個Tools.java
public class Tools {
private static final String handle = Tools.class.getSimpleName();
public void imageLoading(Context context, String url, ImageView imageView) {
ImageLoaderConfiguration config = new ImageLoaderConfiguration
.Builder(context)
.memoryCacheExtraOptions(480, 800) //保存每個緩存圖片的最大寬高
.threadPriority(Thread.NORM_PRIORITY - 2) //線池中的緩存數
.denyCacheImageMultipleSizesInMemory() //禁止緩存多張圖片
.memoryCache(new FIFOLimitedMemoryCache(2 * 1024 * 1024))//缓存策略
// .memoryCacheSize(50 * 1024 * 1024) //設置內存緩存的大小
.diskCacheFileNameGenerator(new Md5FileNameGenerator()) //缓存文件名的保存方式
// .diskCacheSize(200 * 1024 * 1024) //緩存大小
.tasksProcessingOrder(QueueProcessingType.LIFO) //工作序列
.diskCacheFileCount(200) //緩存的文件數量
.build();
if (!ImageLoader.getInstance().isInited()) {//偵測如果imagloader已經init,就不再init
Log.d(handle, "CheckPoint init");
ImageLoader.getInstance().init(config);
}
ImageLoader.getInstance().displayImage(url, imageView, ImageUsing);
}
// UsingFreqLimitedMemoryCache(如果緩存的圖片總量超過限定值,先刪除使用頻率最小的bitmap)
// LRULimitedMemoryCache(這個也是使用的lru算法,和LruMemoryCache不同的是,他緩存的是bitmap的弱引用)
// FIFOLimitedMemoryCache(先進先出的緩存策略,當超過設定值,先刪除最先加入緩存的bitmap)
// LargestLimitedMemoryCache(當超過緩存限定值,先刪除最大的bitmap對象)
// LimitedAgeMemoryCache(當bitmap加入緩存中的時間超過我們設定的值,將其刪除)
// Universal-Image-Loader的硬盤緩存策略
// 詳細的硬盤緩存策略可以移步:http://blog.csdn.net/xiaanming/article/details/27525741,下方是總結的結果:
// FileCountLimitedDiscCache(可以設定緩存圖片的個數,當超過設定值,刪除掉最先加入到硬盤的文件)
// LimitedAgeDiscCache(設定文件存活的最長時間,當超過這個值,就刪除該文件)
// TotalSizeLimitedDiscCache(設定緩存bitmap的最大值,當超過這個值,刪除最先加入到硬盤的文件)
// UnlimitedDiscCache(這個緩存類沒有任何的限制)
DisplayImageOptions ImageUsing = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.loading)//圖片還沒下載好時跑的臨時圖片
.showImageForEmptyUri(R.drawable.loading)
.showImageOnFail(R.drawable.loading).cacheInMemory(true)//緩存
.cacheOnDisc(true).bitmapConfig(Bitmap.Config.RGB_565)
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.build();
}
//.showImageOnLoading(R.drawable.loading)//圖片還沒下載好時跑的臨時圖片
//.showImageOnFail(R.drawable.loading)//圖片讀取失敗時跑的臨時圖片
所以請在drawable內放入您自己想放入的圖片。
使用方式:
/**
* imageLoading(Context context, String url, ImageView imageView)
* context就是context;
* url:你需要讀取圖片的網址
* imageview:你指定findViewById的物件
*/
tools.imageLoading(context, url, imageView);
當然你也可以使用ImageLoader.getInstance().displayImage(url, imageView, ImageUsing);
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.chat.a015865.imageloderdemo.MainActivity">
<ImageView
android:layout_centerInParent="true"
android:id="@+id/show"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {
private ImageView imageView;
private Tools tools=new Tools();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initSet();
}
private void initView() {
imageView = (ImageView)findViewById(R.id.show);
}
private void initSet() {
String url = "https://www.cloudnloud.com/wp-content/uploads/2016/07/podcast-ac-new_2.jpg";
tools.imageLoading(this, url, imageView);
}
}
Tools.java
public class Tools {
private static final String handle = Tools.class.getSimpleName();
public void imageLoading(Context context, String url, ImageView imageView) {
ImageLoaderConfiguration config = new ImageLoaderConfiguration
.Builder(context)
.memoryCacheExtraOptions(480, 800) //保存每個緩存圖片的最大寬高
.threadPriority(Thread.NORM_PRIORITY - 2) //線池中的緩存數
.denyCacheImageMultipleSizesInMemory() //禁止緩存多張圖片
.memoryCache(new FIFOLimitedMemoryCache(2 * 1024 * 1024))//缓存策略
// .memoryCacheSize(50 * 1024 * 1024) //設置內存緩存的大小
.diskCacheFileNameGenerator(new Md5FileNameGenerator()) //缓存文件名的保存方式
// .diskCacheSize(200 * 1024 * 1024) //緩存大小
.tasksProcessingOrder(QueueProcessingType.LIFO) //工作序列
.diskCacheFileCount(200) //緩存的文件數量
.build();
if (!ImageLoader.getInstance().isInited()) {//偵測如果imagloader已經init,就不再init
Log.d(handle, "CheckPoint init");
ImageLoader.getInstance().init(config);
}
ImageLoader.getInstance().displayImage(url, imageView, ImageUsing);
}
DisplayImageOptions ImageUsing = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.loading)
.showImageForEmptyUri(R.drawable.loading)
.showImageOnFail(R.drawable.loading).cacheInMemory(true)//緩存
.cacheOnDisc(true).bitmapConfig(Bitmap.Config.RGB_565)
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.build();
}
最後別忘了,加權限。 TMD寫Demo被這雷了十分鐘。QQ
<uses-permission android:name="android.permission.INTERNET"/>
Demo下載:
https://drive.google.com/open?id=0Byk75IYx-dKXWFNjMFRoQ3N2Rkk


沒有留言:
張貼留言