搜索
您的当前位置:首页android异步加载网络图片

android异步加载网络图片

来源:爱问旅游网


android异步加载网络图片

1.异步加载图片类

package com.mingda.show.util.image;

import java.io.File;

import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream;

import java.lang.ref.SoftReference; import java.util.HashMap;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory; import android.os.Handler; import android.os.Message;

import android.widget.ImageView; /**

* 异步图片加载类 *

* @author wanghao * */

public class AsyncBitmapLoader { /**

* 内存图片软应用缓存 */

private HashMap> imageCache = null; /**

* 本地图片缓存路径 */

private static final String cacheLocation = \"/mnt/sdcard/test/\";

/**

* 构造函数 */

public AsyncBitmapLoader() { imageCache = new HashMap>(); }

public Bitmap loadBitmap(final ImageView imageView, final String imageURL, final ImageCallBack imageCallBack) { /**

* 如果在内存缓存中,则返回Bitmap对象 */

if (imageCache.containsKey(imageURL)) { SoftReference reference = imageCache.get(imageURL);

Bitmap bitmap = reference.get(); if (bitmap != null) { return bitmap; }

} else { /**

* 如果没有缓存,则在本地缓存中查找 */

String bitmapName =

imageURL.substring(imageURL.lastIndexOf(\"/\") + 1); File cacheDir = new File(cacheLocation); File[] cacheFiles = cacheDir.listFiles(); int i = 0;

if (null != cacheFiles) {

for (; i < cacheFiles.length; i++) {

if (bitmapName.equals(cacheFiles[i].getName())) {

break; } }

if (i < cacheFiles.length) {

return BitmapFactory.decodeFile(cacheLocation + bitmapName); } } }

final Handler handler = new Handler() { @Override

public void handleMessage(Message msg) {

imageCallBack.imageLoad(imageView, (Bitmap) msg.obj); } }; /**

* 如果不在本地内存缓存中,也不在本地(被JVM回收掉),则开启线程下载图片 */

new Thread(){

@Override

public void run() {

InputStream bitmapIs = HttpUtils.getStreamFromURL(imageURL); Bitmap bitmap =

BitmapFactory.decodeStream(bitmapIs);

imageCache.put(imageURL, new SoftReference(bitmap));

Message msg = handler.obtainMessage(0, bitmap); handler.sendMessage(msg);

File dir = new File(cacheLocation); if (!dir.exists()) { dir.mkdirs(); }

File bitmapFile = new File(cacheLocation + imageURL.substring(imageURL.lastIndexOf(\"/\") + 1)); if (!bitmapFile.exists()) { try {

bitmapFile.createNewFile(); } catch (IOException e) { e.printStackTrace(); } }

FileOutputStream fos; try {

fos = new FileOutputStream(bitmapFile);

bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);

} catch (Exception e) { e.printStackTrace(); } }

}.start(); return null; }

public interface ImageCallBack {

public void imageLoad(ImageView imageView, Bitmap bitmap); } }

2.网络获取类

package com.mingda.show.util.image;

import java.io.InputStream;

import java.net.HttpURLConnection; import java.net.URL; /** *

* 网络获取类 *

* @author wanghao * */

public class HttpUtils { /** * * 根据URL获取输入流对象 *

* @param imageURL 文件URL地址 *

* @return 输入流对象 * */

public static InputStream getStreamFromURL(String imageURL) { InputStream in = null; try {

URL url = new URL(imageURL);

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

in = connection.getInputStream(); } catch (Exception e) { e.printStackTrace(); }

return in; } }

3.适配器类getview方法加载图片片段

/**

* 设置图片

*/

String image_path = info.getImageUrl(); //异步加载图片 Bitmap bitmap =

asyncBitmapLoader.loadBitmap(holder.appImage, image_path, new ImageCallBack() {

public void imageLoad(ImageView imageView, Bitmap bitmap) {

imageView.setImageBitmap(bitmap); } });

//设置默认图片

if (bitmap == null) {

holder.appImage.setImageResource(R.drawable.empty_photo); } else {

holder.appImage.setImageBitmap(bitmap); }

4.注意在AndroidManifest.xml文件中加入网络访问和写SDCard的权限,不然会报java.net.SocketException: Permission denied和FileNotFound的异常。

android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />

因篇幅问题不能全部显示,请点此查看更多更全内容

Top