在处理加载图片的时候经常遇见 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