MainActivity如下:
- import android.os.Bundle;
- import android.widget.GridView;
- import android.app.Activity;
-
- public class MainActivity extends Activity {
- private GridView mGridView;
- private GridViewAdapter mGridViewAdapter;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- init();
- }
-
- private void init(){
- mGridView = (GridView) findViewById(R.id.gridView);
- mGridViewAdapter = new GridViewAdapter(this, 0, ImagesUrl.Urls, mGridView);
- mGridView.setAdapter(mGridViewAdapter);
- }
-
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- mGridViewAdapter.cancelAllTasks();
- }
GridViewAdapter如下:
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.util.HashSet;
- import android.annotation.SuppressLint;
- import android.content.Context;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.os.AsyncTask;
- import android.support.v4.util.LruCache;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.AbsListView;
- import android.widget.AbsListView.OnScrollListener;
- import android.widget.ArrayAdapter;
- import android.widget.GridView;
- import android.widget.ImageView;
- @SuppressLint("NewApi")
- public class GridViewAdapter extends ArrayAdapter<String> {
-
- private GridView mGridView;
-
- private LruCache<String, Bitmap> mLruCache;
-
- private HashSet<DownloadBitmapAsyncTask> mDownloadBitmapAsyncTaskHashSet;
-
- private int mFirstVisibleItem;
-
- private int mVisibleItemCount;
-
- private boolean isFirstEnterThisActivity = true;
-
- public GridViewAdapter(Context context, int textViewResourceId,String[] objects, GridView gridView) {
- super(context, textViewResourceId, objects);
-
- mGridView = gridView;
- mGridView.setOnScrollListener(new ScrollListenerImpl());
-
- mDownloadBitmapAsyncTaskHashSet = new HashSet<DownloadBitmapAsyncTask>();
-
-
- int maxMemory = (int) Runtime.getRuntime().maxMemory();
-
- int cacheSize = maxMemory/6;
-
- mLruCache = new LruCache<String, Bitmap>(cacheSize) {
- @Override
- protected int sizeOf(String key, Bitmap bitmap) {
- return bitmap.getByteCount();
- }
- };
-
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- String url = getItem(position);
- View view;
- if (convertView == null) {
- view = LayoutInflater.from(getContext()).inflate(R.layout.gridview_item, null);
- } else {
- view = convertView;
- }
- ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
-
- imageView.setTag(url);
-
- setImageForImageView(url, imageView);
- return view;
- }
-
-
- private void setImageForImageView(String imageUrl, ImageView imageView) {
- Bitmap bitmap = getBitmapFromLruCache(imageUrl);
- if (bitmap != null) {
- imageView.setImageBitmap(bitmap);
- } else {
- imageView.setImageResource(R.drawable.default_image);
- }
- }
-
-
- public void addBitmapToLruCache(String key, Bitmap bitmap) {
- if (getBitmapFromLruCache(key) == null) {
- mLruCache.put(key, bitmap);
- }
- }
-
-
- public Bitmap getBitmapFromLruCache(String key) {
- return mLruCache.get(key);
- }
-
-
-
-
- private void loadBitmaps(int firstVisibleItem, int visibleItemCount) {
- try {
- for (int i = firstVisibleItem; i < firstVisibleItem + visibleItemCount; i++) {
- String imageUrl = ImagesUrl.Urls[i];
- Bitmap bitmap = getBitmapFromLruCache(imageUrl);
- if (bitmap == null) {
- DownloadBitmapAsyncTask downloadBitmapAsyncTask = new DownloadBitmapAsyncTask();
- mDownloadBitmapAsyncTaskHashSet.add(downloadBitmapAsyncTask);
- downloadBitmapAsyncTask.execute(imageUrl);
- } else {
-
- ImageView imageView = (ImageView) mGridView.findViewWithTag(imageUrl);
- if (imageView != null && bitmap != null) {
- imageView.setImageBitmap(bitmap);
- }
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
-
- public void cancelAllTasks() {
- if (mDownloadBitmapAsyncTaskHashSet != null) {
- for (DownloadBitmapAsyncTask task : mDownloadBitmapAsyncTaskHashSet) {
- task.cancel(false);
- }
- }
- }
-
-
- private class ScrollListenerImpl implements OnScrollListener{
-
- @Override
- public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {
- mFirstVisibleItem = firstVisibleItem;
- mVisibleItemCount = visibleItemCount;
- if (isFirstEnterThisActivity && visibleItemCount > 0) {
- loadBitmaps(firstVisibleItem, visibleItemCount);
- isFirstEnterThisActivity = false;
- }
- }
-
-
- @Override
- public void onScrollStateChanged(AbsListView view, int scrollState) {
- if (scrollState == SCROLL_STATE_IDLE) {
- loadBitmaps(mFirstVisibleItem, mVisibleItemCount);
- } else {
- cancelAllTasks();
- }
- }
-
- }
-
-
- class DownloadBitmapAsyncTask extends AsyncTask<String, Void, Bitmap> {
- private String imageUrl;
- @Override
- protected Bitmap doInBackground(String... params) {
- imageUrl = params[0];
- Bitmap bitmap = downloadBitmap(params[0]);
- if (bitmap != null) {
-
- addBitmapToLruCache(params[0], bitmap);
- }
- return bitmap;
- }
-
- @Override
- protected void onPostExecute(Bitmap bitmap) {
- super.onPostExecute(bitmap);
-
- ImageView imageView = (ImageView) mGridView.findViewWithTag(imageUrl);
- if (imageView != null && bitmap != null) {
- imageView.setImageBitmap(bitmap);
- }
- mDownloadBitmapAsyncTaskHashSet.remove(this);
- }
- }
-
-
- private Bitmap downloadBitmap(String imageUrl) {
- Bitmap bitmap = null;
- HttpURLConnection httpURLConnection = null;
- try {
- URL url = new URL(imageUrl);
- httpURLConnection = (HttpURLConnection) url.openConnection();
- httpURLConnection.setConnectTimeout(5 * 1000);
- httpURLConnection.setReadTimeout(10 * 1000);
- httpURLConnection.setDoInput(true);
- httpURLConnection.setDoOutput(true);
- bitmap = BitmapFactory.decodeStream(httpURLConnection.getInputStream());
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (httpURLConnection != null) {
- httpURLConnection.disconnect();
- }
- }
- return bitmap;
- }
-
- }
ImagesUrl如下:
- public class ImagesUrl {
-
- public final static String[] Urls = new String[] {
- "https://lh6.googleusercontent.com/-55osAWw3x0Q/URquUtcFr5I/AAAAAAAAAbs/rWlj1RUKrYI/s160-c/A%252520Photographer.jpg",
- "https://lh4.googleusercontent.com/--dq8niRp7W4/URquVgmXvgI/AAAAAAAAAbs/-gnuLQfNnBA/s160-c/A%252520Song%252520of%252520Ice%252520and%252520Fire.jpg",
- "https://lh5.googleusercontent.com/-7qZeDtRKFKc/URquWZT1gOI/AAAAAAAAAbs/hqWgteyNXsg/s160-c/Another%252520Rockaway%252520Sunset.jpg",
- "https://lh3.googleusercontent.com/--L0Km39l5J8/URquXHGcdNI/AAAAAAAAAbs/3ZrSJNrSomQ/s160-c/Antelope%252520Butte.jpg",
- "https://lh6.googleusercontent.com/-8HO-4vIFnlw/URquZnsFgtI/AAAAAAAAAbs/WT8jViTF7vw/s160-c/Antelope%252520Hallway.jpg",
- "https://lh4.googleusercontent.com/-WIuWgVcU3Qw/URqubRVcj4I/AAAAAAAAAbs/YvbwgGjwdIQ/s160-c/Antelope%252520Walls.jpg",
- "https://lh6.googleusercontent.com/-UBmLbPELvoQ/URqucCdv0kI/AAAAAAAAAbs/IdNhr2VQoQs/s160-c/Apre%2525CC%252580s%252520la%252520Pluie.jpg"};
}
LruCache为GridView异步加载大量网络图片
原文:http://www.cnblogs.com/yiweiaimeng/p/4969387.html