1. 程式人生 > >Android批量圖片載入經典系列——使用xutil框架快取、非同步載入網路圖片

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>(){

                            @Override

                            
public 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群:JRedu技術交流 (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批量圖片載入經典系列——使用LruCacheAsyncTask快取並非同步載入圖片

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載入圖片(結合RecyclerViewCardView)

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。我們幾乎只要簡單呼叫幾句程式碼就可以很好的實現圖片的載入。很多時候也不需要我們親自去寫圖片載入方案。但是,學習圖片的三級快取策略無論是在面試時,還是對

Androidandroid框架區別(網路框架圖片非同步載入快取框架資料框架)特點整理

在我們安卓開發中,很多繁瑣的程式碼會很頭疼,編寫程式的週期會增加,因此很多框架都冒出來了,我們在搞懂底層原理之時,我們更應該學會用一些優秀框架來解決複雜程式碼,和繁瑣的重寫程式碼。因為針對最簡單的case,我只需要提供request url,成功時的callba