Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> 大圖片在Android的listview中出現內存溢出的解決辦法

大圖片在Android的listview中出現內存溢出的解決辦法

編輯:Android開發實例

 在listview中有很多時候,都因為圖片太大造成內存溢出的問題,下面這個demo用10M大小的圖片測試並沒有出現內存溢出和卡頓現象。

項目截圖

主要代碼:

 

  1. package com.example.listview; 
  2.  
  3. import android.app.Activity; 
  4. import android.os.Bundle; 
  5. import android.view.Menu; 
  6. import android.widget.ListView; 
  7.  
  8. public class MainActivity extends Activity { 
  9.     ListAdapter mAdapter; 
  10.     ListView mListView; 
  11.     int count = 100; 
  12.  
  13.     @Override 
  14.     protected void onCreate(Bundle savedInstanceState) { 
  15.         super.onCreate(savedInstanceState); 
  16.         setContentView(R.layout.activity_main); 
  17.         mListView = (ListView) findViewById(R.id.listView1); 
  18.         mAdapter = new ListAdapter(this,mListView); 
  19.         mAdapter.setData(count); 
  20.         mListView.setAdapter(mAdapter); 
  21.     } 
  22.  
  23.     @Override 
  24.     public boolean onCreateOptionsMenu(Menu menu) { 
  25.         // Inflate the menu; this adds items to the action bar if it is present. 
  26.         getMenuInflater().inflate(R.menu.activity_main, menu); 
  27.         return true; 
  28.     } 
  29.  

adapter:

 

  1. package com.example.listview; 
  2.  
  3. import java.util.ArrayList; 
  4.  
  5. import android.content.Context; 
  6. import android.graphics.Bitmap; 
  7. import android.view.LayoutInflater; 
  8. import android.view.View; 
  9. import android.view.ViewGroup; 
  10. import android.widget.AbsListView; 
  11. import android.widget.BaseAdapter; 
  12. import android.widget.ImageView; 
  13. import android.widget.ListView; 
  14.  
  15. public class ListAdapter extends BaseAdapter { 
  16.     int mData; 
  17.     Context mContext; 
  18.     ListView mListView; 
  19.     SyncImageLoader mSyncImageLoader; 
  20.     ArrayList<String> mlist; 
  21.     public ListAdapter(Context context,ListView listView) { 
  22.         super(); 
  23.         this.mContext = context; 
  24.         this.mListView=listView; 
  25.         this.mListView.setOnScrollListener(onScrollListener); 
  26.         mSyncImageLoader=new SyncImageLoader(); 
  27.         mlist=new ArrayList<String>(); 
  28.     } 
  29.  
  30.     public void setData(int data) { 
  31.         this.mData = data; 
  32.     } 
  33.  
  34.     @Override 
  35.     public int getCount() { 
  36.         // TODO Auto-generated method stub 
  37.         return mData; 
  38.     } 
  39.  
  40.     @Override 
  41.     public Object getItem(int arg0) { 
  42.         // TODO Auto-generated method stub 
  43.         return arg0; 
  44.     } 
  45.  
  46.     @Override 
  47.     public long getItemId(int arg0) { 
  48.         // TODO Auto-generated method stub 
  49.         return arg0; 
  50.     } 
  51.  
  52.     @Override 
  53.     public View getView(int position, View convertView, ViewGroup arg2) { 
  54.         ViewHolder holder = null; 
  55.         if (convertView == null) { 
  56.             holder = new ViewHolder(); 
  57.             LayoutInflater inflater = LayoutInflater.from(mContext); 
  58.             convertView = inflater.inflate(R.layout.list_item, null); 
  59.             holder.iv01 = (ImageView) convertView.findViewById(R.id.imageView1); 
  60.             convertView.setTag(holder); 
  61.         } else { 
  62.             holder = (ViewHolder) convertView.getTag(); 
  63.         } 
  64.         holder.iv01.setId(0x7f021000+position); 
  65.         if(mlist.contains("/sdcard/pic_01.jpg")){ 
  66.             holder.iv01.setImageBitmap(MyBitmap.readBitMap("/sdcard/pic_01.jpg"+"1.jpg",1)); 
  67.         }else{ 
  68.             holder.iv01 
  69.             .setImageBitmap(MyBitmap.readBitMap(mContext, R.drawable.load)); 
  70.             mSyncImageLoader.loadImage(position, "/sdcard/pic_01.jpg", imageLoadListener); 
  71.             mlist.add("/sdcard/pic_01.jpg"); 
  72.         } 
  73.         return convertView; 
  74.     } 
  75.     class ViewHolder { 
  76.         public ImageView iv01; 
  77.     } 
  78.     AbsListView.OnScrollListener onScrollListener = new AbsListView.OnScrollListener() { 
  79.         public void onScroll(AbsListView view, int firstVisibleItem, 
  80.                 int visibleItemCount, int totalItemCount) { 
  81.         } 
  82.  
  83.         public void onScrollStateChanged(final AbsListView view, int scrollState) { 
  84.             //滑動的三種狀態,當滑動停止之後加載圖片 
  85.             switch (scrollState) { 
  86.             case AbsListView.OnScrollListener.SCROLL_STATE_FLING: 
  87.                 System.out.println("SCROLL_STATE_FLING"); 
  88.                 mSyncImageLoader.lock(); 
  89.                 break; 
  90.             case AbsListView.OnScrollListener.SCROLL_STATE_IDLE: 
  91.                 System.out.println("SCROLL_STATE_IDLE"); 
  92.                 loadImage(); 
  93.                 break; 
  94.             case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: 
  95.                 System.out.println("SCROLL_STATE_TOUCH_SCROLL"); 
  96.                 mSyncImageLoader.lock(); 
  97.                 break; 
  98.             default: 
  99.                 break; 
  100.             } 
  101.         } 
  102.     }; 
  103.     private void loadImage(){ 
  104.         int start = mListView.getFirstVisiblePosition(); 
  105.         int end = mListView.getLastVisiblePosition(); 
  106.         if (end >= getCount()) { 
  107.             end = getCount() - 1; 
  108.         } 
  109.         mSyncImageLoader.setLoadLimit(start, end); 
  110.         mSyncImageLoader.unlock(); 
  111.     } 
  112.     SyncImageLoader.OnImageLoadListener imageLoadListener = new SyncImageLoader.OnImageLoadListener() { 
  113.         public void OnImageLoad(Integer t, Bitmap bitmap) { 
  114.             ImageView iv01 =(ImageView) mListView.findViewById(0x7f021000+t); 
  115.             if(iv01 !=null){ 
  116.                 iv01.setImageBitmap(bitmap); 
  117.             } 
  118.         } 
  119.     }; 

SyncImageLoader:

 

  1. package com.example.listview; 
  2.  
  3. import java.util.ArrayList; 
  4.  
  5. import android.graphics.Bitmap; 
  6. import android.os.Handler; 
  7.  
  8. public class SyncImageLoader { 
  9.     private Object lock = new Object(); 
  10.     // 是否允許加載圖片 
  11.     private boolean mAllowLoad = true; 
  12.     // 開始加載圖片的位置 
  13.     private int mStartLoadLimit = 0; 
  14.     // 停止加載圖片的位置 
  15.     private int mStopLoadLimit = 0; 
  16.     ArrayList<String> list=new ArrayList<String>(); 
  17.     Bitmap mBitmap; 
  18.     Handler handler = new Handler(); 
  19.  
  20.     public interface OnImageLoadListener { 
  21.         public void OnImageLoad(Integer id, Bitmap bitmap); 
  22.     } 
  23.  
  24.     public void setLoadLimit(int startLoadLimit, int stopLoadLimit) { 
  25.         mStartLoadLimit = startLoadLimit; 
  26.         mStopLoadLimit = stopLoadLimit; 
  27.     } 
  28.  
  29.     public void lock() { 
  30.         mAllowLoad = false; 
  31.     } 
  32.  
  33.     public void unlock() { 
  34.         mAllowLoad = true; 
  35.         synchronized (lock) { 
  36.             lock.notifyAll(); 
  37.         } 
  38.     } 
  39.  
  40.     public void loadImage(Integer t, String imageUrl, 
  41.             OnImageLoadListener listener) { 
  42.         final OnImageLoadListener mListener = listener; 
  43.         final String mImageUrl = imageUrl; 
  44.         final Integer mt = t; 
  45.         new Thread(new Runnable() { 
  46.             public void run() { 
  47.                 if (!mAllowLoad) { 
  48.                     synchronized (lock) { 
  49.                         try { 
  50.                             lock.wait(); 
  51.                         } catch (Exception e) { 
  52.                             e.printStackTrace(); 
  53.                         } 
  54.                     } 
  55.                 } 
  56.                 if (mStopLoadLimit == 0 && mStartLoadLimit == 0) { 
  57.                     loadImage(mImageUrl, mt, mListener); 
  58.                 } 
  59.                 if (mAllowLoad && mt <= mStopLoadLimit && mt >= mStartLoadLimit) { 
  60.                     System.out.println("loadImage"); 
  61.                     loadImage(mImageUrl, mt, mListener); 
  62.                 } 
  63.             } 
  64.         }).start(); 
  65.     } 
  66.  
  67.     private void loadImage(final String mImagePath, final Integer mt, 
  68.             final OnImageLoadListener mListener) { 
  69.         try { 
  70.             if(list.contains(mImagePath)){ 
  71.                 mBitmap = MyBitmap.readBitMap(mImagePath + "1.jpg",1); 
  72.             }else{ 
  73.                 mBitmap = MyBitmap.readBitMap(mImagePath,20); 
  74.                 MyBitmap.saveFile(mBitmap, mImagePath + "1.jpg"); 
  75.                 list.add(mImagePath); 
  76.             } 
  77.             handler.post(new Runnable() { 
  78.                 public void run() { 
  79.                     if (mAllowLoad) { 
  80.                         mListener.OnImageLoad(mt, mBitmap); 
  81.                     } 
  82.                 } 
  83.             }); 
  84.         } catch (Exception e) { 
  85.             e.printStackTrace(); 
  86.         } 
  87.     } 
  88.      

MyBitmap:

 

  1. package com.example.listview; 
  2.  
  3. import java.io.BufferedOutputStream; 
  4. import java.io.File; 
  5. import java.io.FileInputStream; 
  6. import java.io.FileNotFoundException; 
  7. import java.io.FileOutputStream; 
  8. import java.io.IOException; 
  9. import java.io.InputStream; 
  10.  
  11. import android.content.Context; 
  12. import android.graphics.Bitmap; 
  13. import android.graphics.BitmapFactory; 
  14.  
  15. public class MyBitmap { 
  16.     public static Bitmap readBitMap(String fileName,int n) { 
  17.         BitmapFactory.Options opt = new BitmapFactory.Options(); 
  18.         opt.inPreferredConfig = Bitmap.Config.RGB_565; 
  19.         opt.inSampleSize = n; // width,hight設為原來的十分一 
  20.         opt.inPurgeable = true; 
  21.         opt.inInputShareable = true; // 獲取資源圖片 
  22.         FileInputStream fis = null; 
  23.         try { 
  24.             fis = new FileInputStream(fileName); 
  25.         } catch (FileNotFoundException e) { 
  26.             // TODO Auto-generated catch block 
  27.             e.printStackTrace(); 
  28.         } 
  29.         return BitmapFactory.decodeStream(fis, null, opt); 
  30.     } 
  31.     public static Bitmap readBitMap(Context context, int resId) { 
  32.         BitmapFactory.Options opt = new BitmapFactory.Options(); 
  33.         opt.inPreferredConfig = Bitmap.Config.RGB_565; 
  34.         // opt.inSampleSize = 10; //width,hight設為原來的十分一 
  35.         opt.inPurgeable = true; 
  36.         opt.inInputShareable = true; // 獲取資源圖片 
  37.         InputStream is = context.getResources().openRawResource(resId); 
  38.         return BitmapFactory.decodeStream(is, null, opt); 
  39.     } 
  40.     public static void saveFile(Bitmap bm, String fileName) throws IOException { 
  41.         File myCaptureFile = new File(fileName); 
  42.         BufferedOutputStream bos = new BufferedOutputStream( 
  43.                 new FileOutputStream(myCaptureFile)); 
  44.         bm.compress(Bitmap.CompressFormat.JPEG, 80, bos); 
  45.         bos.flush(); 
  46.         bos.close(); 
  47.     } 
  48.      

csdn下載地址:http://download.csdn.net/detail/wenwei19861106/4865907

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved