Android批量圖片載入經典系列——使用xutil框架快取、非同步載入網路圖片
一、問題描述 |
為提高圖片載入的效率,需要對圖片的採用快取和非同步載入策略,編碼相對比較複雜,實際上有一些優秀的框架提供瞭解決方案,比如近期在git上比較活躍的xutil框架
Xutil框架提供了四大模組:
1、 DbUtil模組:採用ORM機制簡化Sqlite操作,一行程式碼就可執行增刪改查、支援事務、支援延遲策略
2、 ViewUtils模組:可以說是Android的IOC框架,可以註解方式對ui、資源、事件進行繫結
3、 HttpUtils模組:支援同步、非同步請求、支援大檔案上傳
4、 BitmapUtils模組:圖片的非同步載入,支援本地和網路圖片, 圖片的壓縮處理, 圖片的記憶體快取以及本地檔案快取。
本案例主要使用Xutil的HttpUtils模組和BitmapUtils模組
二、案例介紹 |
實現圖片新聞瀏覽:
三、案例主要技術 |
1、使用HttpUtils模組實現網路通訊
(1)RequestParams元件設定請求引數、上傳檔案等資訊
RequestParams params = new RequestParams(“utf-8”); // 預設編碼UTF-8 params.addQueryStringParameter("categoryId","2");//設定引數
(2) HttpUtils元件傳送請求
HttpUtils http = new HttpUtils(); http.configResponseTextCharset("utf-8");// 設定返回文字的編碼, 預設編碼UTF-8 //傳送請求,分別設定傳送方式、url、傳遞資料、回撥元件 httpUtils.send(HttpMethod.POST, "http://192.168.2.178:8080/21-sun/PhotosServlet", params, new RequestCallBack<String>(){ @Overridepublic void onFailure(HttpException e, String m) {//執行失敗回撥方法 Log.i("jereh", e.getExceptionCode()+" "+m); } @Overrid public void onSuccess(ResponseInfo<String> info) { //執行成功回撥方法,並傳入資料,通過info.result獲得返回資料 } });
2、使用BitmapUtils圖片的非同步載入
使用BitmapUtils圖片的非同步載入,支援本地和網路圖片, 圖片的壓縮處理。
(1)、BitmapDisplayConfig圖片顯示的配置
BitmapDisplayConfig bigPicDisplayConfig = new BitmapDisplayConfig(); // 顯示原始圖片,不壓縮, 儘量不要使用, 圖片太大時容易OOM。 bigPicDisplayConfig.setShowOriginal(true); bigPicDisplayConfig.setBitmapConfig(Bitmap.Config.RGB_565); //設定圖片的最大尺寸, 不設定時更具控制元件屬性自適應 displayConfig.setBitmapMaxSize(BitmapCommonUtils.getScreenSize(mActivity)); //實現一個漸變動畫。 AlphaAnimation animation=new AlphaAnimation(0.1f,1.0f); animation.setDuration(500); displayConfig.setAnimation(animation);
(2) 建立BitmapUtils
構造:
/** * @param context 上下文 * @param diskCachePath 磁碟快取記憶體路徑 * @param memoryCacheSize 記憶體快取大小 * @param diskCacheSize 磁碟快取空間大小 */ BitmapUtils(Context context, String diskCachePath, int memoryCacheSize, int diskCacheSize)
其他形式
BitmapUtils(Context context) BitmapUtils(Context context, String diskCachePath) BitmapUtils(Context context, String diskCachePath, int memoryCachePercent);
程式碼:
// 獲取應用程式最大可用記憶體 int maxMemory = (int) Runtime.getRuntime().maxMemory(); int cacheSize = maxMemory / 8; FileUtils fileUtils=new FileUtils(mActivity, "jereh"); //設定檔案快取、記憶體快取大小 BitmapUtils utils=new BitmapUtils(mActivity,fileUtils.getCacheDir(),cacheSize);
(3)display()方法非同步載入圖片並顯示到View控制元件上
utils.display(T container , String uri, BitmapDisplayConfig displayConfig);
3、Gson元件實現json資料的解析
Gson gson=new Gson();//建立gson元件 //將伺服器返回的JSON資料,使用Gson解析 List<ImageInfo> imageInfo=gson.fromJson(“JSON資料”, new TypeToken<ArrayList<ImageInfo>>(){}.getType());
四、案例完整程式碼 |
1、PhotoBrowseAdapter介面卡程式碼
public class PhotoBrowseAdapter extends PagerAdapter { private Activity mActivity; private List<ImageInfo> imageList; private LayoutInflater inflate; private BitmapUtils utils; private BitmapDisplayConfig displayConfig; public PhotoBrowseAdapter(Activity mActivity, List<ImageInfo> imageList) { super(); this.mActivity = mActivity; this.imageList = imageList; inflate=LayoutInflater.from(mActivity); // 獲取應用程式最大可用記憶體 int maxMemory = (int) Runtime.getRuntime().maxMemory(); int cacheSize = maxMemory / 8; FileUtils fileUtils=new FileUtils(mActivity, "jereh"); utils=new BitmapUtils(mActivity,fileUtils.getCacheDir(),cacheSize); displayConfig=new BitmapDisplayConfig(); //displayConfig.setShowOriginal(true); // 顯示原始圖片,不壓縮, 儘量不要使用, 圖片太大時容易OOM。 //utils.configDefaultBitmapMaxSize(BitmapCommonUtils.getScreenSize(mActivity)); displayConfig.setBitmapMaxSize(BitmapCommonUtils.getScreenSize(mActivity)); AlphaAnimation animation=new AlphaAnimation(0.1f,1.0f); animation.setDuration(500); displayConfig.setAnimation(animation); } @Override public int getCount() { // TODO Auto-generated method stub return imageList.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { // TODO Auto-generated method stub return arg0==arg1; } @Override public Object instantiateItem(View container,int position){ ImageInfo info=imageList.get(position); LinearLayout view=(LinearLayout)inflate.inflate(R.layout.phone_item, null); ((TextView)view.findViewById(R.id.tvTitle)).setText(info.getImgTitle()); ((TextView)view.findViewById(R.id.tvContent)).setText(info.getImgDesc()); ImageView img=(ImageView)view.findViewById(R.id.ivPhoto); img.setTag(info.getImgUrl()); utils.display(img,info.getImgUrl(),displayConfig); ((ViewPager)container).addView(view); return view; } @Override public void destroyItem(View container,int position,Object obj){ ((ViewPager)container).removeView((View)obj); } }
2、MainActivity程式碼
public class MainActivity extends Activity { private ViewPager vpImagePager; private PhotoBrowseAdapter adapter; private List<ImageInfo> imageInfoList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); vpImagePager=(ViewPager)super.findViewById(R.id.vpImgBrowse); imageInfoList=new ArrayList<ImageInfo>(); adapter=new PhotoBrowseAdapter(this,imageInfoList); loadData(); } private void loadData(){ RequestParams params=new RequestParams(); params.addQueryStringParameter("categoryId","2");//設定引數 HttpUtils httpUtils=new HttpUtils(); //向伺服器傳送請求 httpUtils.send(HttpMethod.POST, "http://192.168.2.178:8080/21-sun/PhotosServlet", params,new RequestCallBack<String>(){ @Override public void onFailure(HttpException e, String m) { Log.i("jereh", e.getExceptionCode()+" "+m); } @Override public void onSuccess(ResponseInfo<String> info) {//後臺執行完成後回撥,並傳入返回資料 Gson gson=new Gson();//建立gson元件 //將info.result伺服器返回的JSON資料,使用Gson解析 List<ImageInfo> imageInfo=gson.fromJson(info.result, new TypeToken<ArrayList<ImageInfo>>(){}.getType()); imageInfoList.addAll(imageInfo); vpImagePager.setAdapter(adapter); } }); } }
3、ImageInfo實體類和 FileUtils工具類
//封裝圖片資訊 public class ImageInfo { private String imgUrl; private String imgTitle; private String imgDesc; …//省略 } FileUtils獲得檔案快取目錄 public class FileUtils { /** 快取檔案目錄 */ private File mCacheDir; public FileUtils(Context context, String cacheDir){ if (android.os.Environment.getExternalStorageState(). equals(android.os.Environment.MEDIA_MOUNTED)) mCacheDir = new File(cacheDir); else mCacheDir = context.getCacheDir();// 如何獲取系統內建的快取儲存路徑 if(!mCacheDir.exists()) mCacheDir.mkdirs(); } public String getCacheDir(){ return mCacheDir.getAbsolutePath(); }
4、服務端PhotosServlet程式碼
public void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/json;charset=utf-8"); String categoryId=request.getParameter("categoryId");//測試傳遞引數 System.out.println(categoryId); List<ImagePart> partList=new ArrayList<ImagePart>(); ImagePart part1=new ImagePart(); part1.setImgUrl("http://news.21-sun.com/UserFiles/x_Image/x_20150216131001_0.jpg"); part1.setImgTitle("代表中國的東風隊,加油!"); part1.setImgDesc("..."); ImagePart part2=new ImagePart(); part2.setImgUrl("http://news.21-sun.com/UserFiles/x_Image/x_20150216131432_0.jpg"); part2.setImgTitle("三亞沃帆賽體驗之旅"); part2.setImgDesc("..."); ImagePart part3=new ImagePart(); part3.setImgUrl("http://news.21-sun.com/UserFiles/x_Image/x_20150216131157_0.jpg"); part3.setImgTitle("沃爾沃集團總裁兼執行長歐羅夫•佩森與沃爾沃"); part3.setImgDesc("..."); partList.add(part1);partList.add(part2);partList.add(part3); JSONArray jsonArray=JSONArray.fromObject(partList,config); response.getWriter().println(jsonArray.toString()); }
想要了解更多內容的小夥伴,可以點選檢視原始碼,親自執行測試。
疑問諮詢或技術交流,請加入官方QQ群: (452379712)
出處:
本文版權歸煙臺傑瑞教育科技有限公司和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。
相關推薦
Android批量圖片載入經典系列——採用二級快取、非同步載入網路圖片
public class AsyncImageLoader{ private MemoryCache mMemoryCache;//記憶體快取 private FileCache mFileCache;//檔案快取 private ExecutorService mExecu
Android批量圖片載入經典系列——使用xutil框架快取、非同步載入網路圖片
一、問題描述 為提高圖片載入的效率,需要對圖片的採用快取和非同步載入策略,編碼相對比較複雜,實際上有一些優秀的框架提供瞭解決方案,比如近期在git上比較活躍的xutil框架 Xutil框架提供了四大模組: 1、 DbUtil模組:採用ORM機制簡化Sqlite操作,
Android批量圖片載入經典系列——afinal框架實現圖片的非同步快取載入
public class MoreStyleNewsListViewAdapter extends BaseAdapter { private Activity mActivity; private List<NewsItem> newsList; private
Android批量圖片載入經典系列——使用LruCache、AsyncTask快取並非同步載入圖片
public class PhotoWallAdapter extends ArrayAdapter<File> implements OnScrollListener { //記錄所有正在下載或等待下載的任務。 private Set<Bit
Android實現圖片快取與非同步載入
ImageManager2這個類具有非同步從網路下載圖片,從sd讀取本地圖片,記憶體快取,硬碟快取,圖片使用動畫漸現等功能,已經將其應用在包含大量圖片的應用中一年多,沒有出現oom。 Android程式常常會記憶體溢位,網上也有很多解決方案,如軟引用,手動呼叫recycle
MybatisDay02(批量generator、二級快取、延遲載入)
mybatis 高階對映 查詢快取 spring集合 mybatis是什麼? mbatis是一個持久層框架,mybatis是一個不完全的ORM框架,sql語句需要程式設計師自己去編寫,但是mybatis有對映(輸入引數對映、輸出結果對映) mybatis入門門檻不高,學習成本低,讓
img標籤src引用網路圖片,頁面不顯示,返回403錯誤,網路圖片地址在瀏覽器能載入,放html卻不能顯示
在html頁面加入<meta name="referrer" content="no-referrer">標籤,就可以解決頁面載入網路圖片的問題,原因大概是網路安全的問題,別人的頁面做了安全防護的問題。<head> <meta chars
ASP.NET MVC搭建專案後臺UI框架—11、自動載入下拉框查詢
需求:在查詢記錄的時候,輸入第一個字,就自動把以這個字開頭的相關記錄查找出來,輸入2個字就過濾以這兩個子開頭的記錄,依次類推。 突然要用到這個功能了,印象中曾經寫過這個功能的文章,一下子找不到了,只好重新貼出來備忘。最近部落格快2個月沒更新了,因為這兩個月一直在閉門寫書。 <link
Android 非同步獲取網路圖片Bitmap資源
這裡主要是為了把獲取圖片的程式碼單獨出來和UI分開,方便擴充套件。 public interface Callback<T> { public void onSuccess(T o
Hibernate(二)一級快取、延遲載入
一級快取概念: 一級快取又稱為session級別的快取,所以當session關閉時一級快取也會關閉。如果每次查詢或修改資料都到資料庫中進行查詢或修改,當資料量比較大時就會對程式的效能產生比較大的影響。而一級快取正好解決了這一問題。每次對資料進行查詢時先到快取中去查詢所需要的
專案實戰:九、GET請求網路圖片
public void requestHttpGet(String strUrl) throwsException{ public static Bitmap httpGETImage(String string) {
iOS富文字手動重新整理和非同步替換網路圖片
CSDN註冊好幾年一直沒用過於是乎今天心血來潮寫一篇技術交流貼,以供有需要的道友。 移動端iOS開發中,少不了遇到NSAttributedString(富文字字典集合)富文字形式進行圖文混排。如果想替換富文字內部某個位置的圖片,有一種方式是找到range,然後重新生成此
mybatis 一對多,多對多等關係xml檔案中sql的寫法以及快取、延遲載入的配置寫法
高階功能https://blog.csdn.net/dfsaggsd/article/details/50555583 對映關係 一對一對映 SQL語句:使用者訂單查詢 SELECT orders.*, USER.username,
node.js抓取網路圖片儲存到本地,node.js抓取防盜鏈網路圖片儲存到本地
node.js抓取網路圖片儲存到本地,node.js抓取防盜鏈網路圖片儲存到本地 使用模組request、fs,request模組在npm裡平均月下載量超過3000W次,那是相當的牛逼。 node版本
網路圖片載入的封裝-(從零開始搭建android框架系列(4))
本篇文章專案github地址:MVPCommon 本文章原地址:簡書部落格 1 有哪些常用的圖片載入庫? 當下使用的主要有Piccaso、Fresco、Android-Universal-Image-Loader、Glide、Volley這五個
Android之Volley框架載入網路圖片
更多幹貨 分散式實戰(乾貨) spring cloud 實戰(乾貨) mybatis 實戰(乾貨) spring boot 實戰(乾貨) React 入門實戰(乾貨) 構建中小型網際網路企業架構(乾貨) python 學習持續更
Android框架之路——Glide載入圖片(結合RecyclerView、CardView)
Android框架之路——Glide載入圖片 一、簡介: 在泰國舉行的谷歌開發者論壇上,谷歌為我們介紹了一個名叫 Glide 的圖片載入庫,作者是bumptech。這個庫被廣泛的運用在google的開源專案中,包括2014年google I/O大會
Android學習之圖片非同步載入框架Picasso
原創地址:http://mcode114.com/android/network/picasso/ Picasso Picasso是Square公司開源的一個Android圖形快取庫。可以實現圖片下載和快取功能。僅僅只需要一行程式碼就能完全實現圖片的非同步載入。使用複
Android經典面試問題:請你設計一套圖片非同步載入快取方案——圖片的三級快取
友情提示:文章最後附有專案原始碼現在,Android有很多優秀的圖片載入框架。例如:Picasso,Glide,Fresco。我們幾乎只要簡單呼叫幾句程式碼就可以很好的實現圖片的載入。很多時候也不需要我們親自去寫圖片載入方案。但是,學習圖片的三級快取策略無論是在面試時,還是對
Android:android的框架區別(網路框架、圖片非同步載入與快取框架、資料框架)特點整理
在我們安卓開發中,很多繁瑣的程式碼會很頭疼,編寫程式的週期會增加,因此很多框架都冒出來了,我們在搞懂底層原理之時,我們更應該學會用一些優秀框架來解決複雜程式碼,和繁瑣的重寫程式碼。因為針對最簡單的case,我只需要提供request url,成功時的callba