網路下載圖片 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
沒有留言:
張貼留言