ImageLoader框架+gridView 加载网络图片与下载

        在处理加载图片的时候经常遇见 OOM的错误,这个demo引用了ImageLoader框架,解决了listView滑动时的卡顿,重用机制得到了更好的体验,增加了下载网络图片的功能,下载后图片的目录在 Download 目录下,代码中没有创建Download 文件夹,手机根目录没有此文件夹的请注意。

特意整理了demo,简单易上手,希望对大家有用。 jar包在libs目录下 。我是用的gridView,listView同理。

点我下载demo

先看图片:

 

demo中只有两个类,简单易懂。

imageUrls 存放的是图片的网址,使用网址是需要注意,有的图片的网址有很多代码的,那种是转码过的,可以看看我在网上找的网址,一级一级的很清楚,最好找这种来测试。

还有一点需要注意的是,imageLoader需要初始化:imageLoader.init(ImageLoaderConfiguration.createDefault(MainActivity.this));

 

               options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.ic_stub)    // 设置图片下载期间显示的图片  
.showImageForEmptyUri(R.drawable.ic_empty)  // 设置图片Uri为空或是错误的时候显示的图片  
.showImageOnFail(R.drawable.ic_error)  // 设置图片加载或解码过程中发生错误显示的图片 
.cacheInMemory(true)    // 设置下载的图片是否缓存在内存中  
.cacheOnDisc(true)   // 设置下载的图片是否缓存在SD卡中 
.bitmapConfig(Bitmap.Config.RGB_565)
.build();         // 创建配置过得DisplayImageOption对象  

 

完成了一个类就可以实现第一张图片的效果了。

 

package com.example.gridview_imageloader;

import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.AdapterView.OnItemClickListener;

public class MainActivity extends Activity {
	String[] imageUrls;
	protected ImageLoader imageLoader;
	DisplayImageOptions options;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		imageLoader = ImageLoader.getInstance();
		imageLoader.init(ImageLoaderConfiguration.createDefault(MainActivity.this));
		imageUrls = new String[]{"http://www.baidu.com/img/bdlogo.gif",
				"http://pic.sc.chinaz.com/files/pic/pic9/201410/apic6568.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201411/apic7677.jpg",
				"http://pic1.sc.chinaz.com/files/pic/pic9/201410/apic6867.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201411/apic7788.jpg",
				"http://pic2.sc.chinaz.com/files/pic/pic9/201411/apic7776.jpg",
				"http://pic1.sc.chinaz.com/files/pic/pic9/201410/apic7203.jpg",
				"http://pic2.sc.chinaz.com/files/pic/pic9/201410/apic7238.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201408/apic5360.jpg",
				"http://pic1.sc.chinaz.com/files/pic/pic9/201407/apic5280.jpg",
				"http://pic1.sc.chinaz.com/files/pic/pic9/201406/apic4599.jpg",
				"http://pic2.sc.chinaz.com/files/pic/pic9/201406/apic4221.jpg",
				"http://pic1.sc.chinaz.com/files/pic/pic9/201405/apic3974.jpg",
				"http://pic2.sc.chinaz.com/files/pic/pic9/201405/apic3859.jpg",
				"http://pic2.sc.chinaz.com/files/pic/pic9/201404/apic195.jpg",
				"http://pic1.sc.chinaz.com/files/pic/pic9/201403/apic669.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201403/apic603.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201403/apic331.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201403/apic306.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201403/apic307.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201403/apic308.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201403/apic309.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201403/apic310.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201403/apic311.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201403/apic312.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201403/apic313.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201403/apic314.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201403/apic315.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201403/apic316.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201403/apic317.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201403/apic318.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201403/apic319.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201403/apic320.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201403/apic321.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201403/apic322.jpg",
				"http://pic.sc.chinaz.com/files/pic/pic9/201403/apic323.jpg"};
		options = new DisplayImageOptions.Builder()
		.showStubImage(R.drawable.ic_stub)
		.showImageForEmptyUri(R.drawable.ic_empty)
		.showImageOnFail(R.drawable.ic_error)
		.cacheInMemory(true)
		.cacheOnDisc(true)
		.bitmapConfig(Bitmap.Config.RGB_565)
		.build();
		GridView gridView = (GridView) findViewById(R.id.gridview);
		gridView.setAdapter(new ImageAdapter());
		gridView.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
				startImagePagerActivity(position);
			}
		});
	}
	public static class Extra {
		public static final String IMAGES = "com.nostra13.example.universalimageloader.IMAGES";
		public static final String IMAGE_POSITION = "com.nostra13.example.universalimageloader.IMAGE_POSITION";
	}
	private void startImagePagerActivity(int position) {
		Intent intent = new Intent(this, ImagePagerActivity.class);
		intent.putExtra(Extra.IMAGES, imageUrls);
		intent.putExtra(Extra.IMAGE_POSITION, position);
		startActivity(intent);
	}
	
	
	public class ImageAdapter extends BaseAdapter {
		@Override
		public int getCount() {
			return imageUrls.length;
		}

		@Override
		public Object getItem(int position) {
			return null;
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			final ImageView imageView;
			if (convertView == null) {
				imageView = (ImageView) getLayoutInflater().inflate(R.layout.item_grid_image, parent, false);
			} else {
				imageView = (ImageView) convertView;
			}
			imageLoader.displayImage(imageUrls[position], imageView, options);
			return imageView;
		}
	}
	
}

 

 

 

 

 

接下来看第二个类,第二个类是点击item时显示的activity,包括下载图片,也在这个类中。

 

 

 

package com.example.gridview_imageloader;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;

import android.os.Bundle;
import android.os.Parcelable;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.Toast;

public class ImagePagerActivity extends Activity {
	private static final String STATE_POSITION = "STATE_POSITION";
	DisplayImageOptions options;
	ViewPager pager;
	int positionPosition;
	String[] imageUrls;
	protected ImageLoader imageLoader;
	public static class Extra {
		public static final String IMAGES = "com.nostra13.example.universalimageloader.IMAGES";
		public static final String IMAGE_POSITION = "com.nostra13.example.universalimageloader.IMAGE_POSITION";
	}
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_image_pager);
		imageLoader = ImageLoader.getInstance();
		imageLoader.init(ImageLoaderConfiguration.createDefault(ImagePagerActivity.this));
		
		Bundle bundle = getIntent().getExtras();
		imageUrls = bundle.getStringArray(Extra.IMAGES);
		//记录 当前图片的位置。
		int pagerPosition = bundle.getInt(Extra.IMAGE_POSITION, 0);
		//保存用户之前的数据
		if (savedInstanceState != null) {
			pagerPosition = savedInstanceState.getInt(STATE_POSITION);
		}
		options = new DisplayImageOptions.Builder()
		.showImageForEmptyUri(R.drawable.ic_empty)
		.showImageOnFail(R.drawable.ic_error)
		.resetViewBeforeLoading(true)
		.cacheOnDisc(true)
		.imageScaleType(ImageScaleType.EXACTLY)
		.bitmapConfig(Bitmap.Config.RGB_565)
		.displayer(new FadeInBitmapDisplayer(300))
		.build();
		pager = (ViewPager) findViewById(R.id.pager);
		pager.setAdapter(new ImagePagerAdapter(imageUrls));
		pager.setCurrentItem(pagerPosition);
	}
	
	
	private class ImagePagerAdapter extends PagerAdapter {

		private String[] images;
		private LayoutInflater inflater;

		ImagePagerAdapter(String[] images) {
			this.images = images;
			inflater = getLayoutInflater();
		}

		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			((ViewPager) container).removeView((View) object);
		}

		@Override
		public void finishUpdate(View container) {
		}

		@Override
		public int getCount() {
			return images.length;
		}

		@Override
		public Object instantiateItem(ViewGroup view, int position) {
			positionPosition = position;
			View imageLayout = inflater.inflate(R.layout.item_pager_image, view, false);
			ImageView imageView = (ImageView) imageLayout.findViewById(R.id.image);
			final ProgressBar spinner = (ProgressBar) imageLayout.findViewById(R.id.loading);

			imageLoader.displayImage(images[position], imageView, options, new SimpleImageLoadingListener() {
				@Override
				public void onLoadingStarted(String imageUri, View view) {
					spinner.setVisibility(View.VISIBLE);
				}

				@Override
				public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
					String message = null;
					// 获取图片失败类型
					switch (failReason.getType()) {	
						case IO_ERROR:				
							message = "Input/Output error";
							break;
						case DECODING_ERROR:		
							message = "Image can't be decoded";
							break;
						case NETWORK_DENIED:		
							message = "Downloads are denied";
							break;
						case OUT_OF_MEMORY:		    
							message = "Out Of Memory error";
							break;
						case UNKNOWN:				
							message = "Unknown error";
							break;
					}
					Toast.makeText(ImagePagerActivity.this, message, Toast.LENGTH_SHORT).show();

					spinner.setVisibility(View.GONE);
				}

				@Override
				public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
					spinner.setVisibility(View.GONE);		
				}
			});

			((ViewPager) view).addView(imageLayout, 0);		
			return imageLayout;
		}

		@Override
		public boolean isViewFromObject(View view, Object object) {
			return view.equals(object);
		}

		@Override
		public void restoreState(Parcelable state, ClassLoader loader) {
		}

		@Override
		public Parcelable saveState() {
			return null;
		}

		@Override
		public void startUpdate(View container) {
		}
	}
	
	
	//按钮。按菜单键,弹出  下载和取消。
	public boolean onCreateOptionsMenu(Menu menu) {
		menu.add(0, 1, 1, "下载");
		menu.add(0, 2, 2, "分享");
		menu.add(0, 3, 3, "取消");
		return super.onCreateOptionsMenu(menu);
	}
	
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case 1:
			//下载图片。
			new Thread() {
				public void run() {
					downloadImages(imageUrls[positionPosition-1]);
				};
			}.start();
			break;

		case 2:
			Toast.makeText(getApplicationContext(), "分享", 1000).show();
			break;
		}
		return super.onOptionsItemSelected(item);
	}

	//从网络上下载图片。
	public void downloadImages(String imageUrl){
		 HttpGet httpRequest = new HttpGet(imageUrl);  
	        //取得HttpClient 对象  
	        HttpClient httpclient = new DefaultHttpClient();  
	        try {  
	            //请求httpClient ,取得HttpRestponse  
	            HttpResponse httpResponse = httpclient.execute(httpRequest);  
	            if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){  
	                //取得相关信息 取得HttpEntiy  
	                HttpEntity httpEntity = httpResponse.getEntity();  
	                //获得一个输入流  
	                InputStream is = httpEntity.getContent();  
	                System.out.println(is.available());  
	                System.out.println("Get, Yes!");  
	                Log.e("====================", is.available()+"");
	                Log.e("====================", "Get, Yes!");
	                Bitmap bitmap = BitmapFactory.decodeStream(is);  
	                is.close();  
	                //时间命名
	                SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");//获取当前时间,进一步转化为字符串
			        Date date =new Date();
			        String pictureName=format.format(date);
	                saveMyBitmap(pictureName, bitmap);
	            }  
	              
	        } catch (ClientProtocolException e) {  
	            // TODO Auto-generated catch block  
	            e.printStackTrace();  
	        } catch (IOException e) {  
	            // TODO Auto-generated catch block  
	            e.printStackTrace();  
	        }  
	}
	
	public void saveMyBitmap(String bitName,Bitmap mBitmap){
		  File f = new File("/sdcard/download/" + bitName + ".jpg");
		  try {
		   f.createNewFile();
		  } catch (IOException e) {
		   // TODO Auto-generated catch block
		 
		  }
		  FileOutputStream fOut = null;
		  try {
		   fOut = new FileOutputStream(f);
		  } catch (FileNotFoundException e) {
		   e.printStackTrace();
		  }
		  mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
		  
		  runOnUiThread(new Runnable() {		
				public void run() {
					//show the image
					 Toast.makeText(getApplicationContext(), "下载成功", 1000).show();
				}
			});
		 
		  try {
		   fOut.flush();
		  } catch (IOException e) {
		   e.printStackTrace();
		  }
		  try {
		   fOut.close();
		  } catch (IOException e) {
		   e.printStackTrace();
		  }
		 }

}

 

 

 

 

 

相信看代码大家应该看得懂了。就不多解释了,因为追究深了我也不会。

 最后注意一下权限问题。

 

    <!-- 网络访问权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 文件写入SD卡权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

 

 

 

如果有什么问题欢迎留言大家一起探讨。

转载请注明出处:http://blog.csdn.net/u011368551/article/details/41724211

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值