用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - android代码库

图片异步加载

2013-07-06 作者: 云代码会员举报

[android]代码库

package com.mosjoy.ad.widget;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.ref.SoftReference;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import com.mosjoy.ad.MosJoyAdApplication;
import com.mosjoy.ad.R;
import com.mosjoy.ad.utils.FileCache;
import com.mosjoy.ad.utils.ImageCache;
import com.mosjoy.ad.utils.Utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Environment;
import android.os.StatFs;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;

/**
 * 图片异步加载工具类
 * @author zouyb
 *
 */
public class RemoteImageView extends ImageView {

	/**
	 * 下载失败最大重复次数
	 */
	private static int MAX_FAILURES = 3;

	/**
	 * 下载图片网址
	 */
	private String mUrl;

	/**
	 * 当前下载成功图片网址
	 */
	private String mCurrentlyGrabbedUrl;

	/**
	 * 下载失败次数
	 */
	private int mFailure;

	/**
	 * 默认图片资源id
	 */
	private Integer mDefaultImage;

	/**
	 * 上下文
	 */
	private Context mContext;
	
	/**
	 *  文件操作
	 */
	private FileCache fileCache;

	private final static int MB = 1048576;
	
	//图片宽度
	private int pwidth=-1;
	//图片高度
	private int pheight=-1;
	//是否显示默认图片
	private boolean isShowDefault=false;
	public RemoteImageView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		mContext = context;
		init();
	}

	public RemoteImageView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mContext = context;
		init();
	}

	public RemoteImageView(Context context) {
		super(context);
		mContext = context;
		init();
	}

	/**
	 * Sharable code between constructors
	 */
	private void init() {
		fileCache = new FileCache(mContext);
	}

	public void setImageUrl(String url) {
		System.out.println("width="+pwidth+",height="+pheight);
		System.out.println("url="+url);
		if(("").equals(url) || url == null||url.contains("null")){
			if(isShowDefault){
				setImageResource(R.drawable.default_image);
			}else{
				setVisibility(View.GONE);
			}
			return;
		}
		setVisibility(View.VISIBLE);
		url = url.replace("\\", "/");
		mUrl = url;
		MosJoyAdApplication instance = MosJoyAdApplication.getInstance();
		ImageCache imageCache = instance.getImageCache();
		if (imageCache.isCached(mUrl)) {
			// 图片在缓存中
			this.setImageBitmap(imageCache.get(mUrl).get());
			Log.e(MosJoyAdApplication.TAG, "从内存加载图片 " + url);
		} else {
			File f = new File(mUrl);
			Bitmap b = decodeFile(f);
			if(b != null){
				//从内存卡加载
				this.setImageBitmap(b);
				imageCache.put(mUrl,new SoftReference<Bitmap>(b));
				Log.e(MosJoyAdApplication.TAG, "从本地加载图片 " + url);
			}else{
				//防止重复下载
				//if(YYQMusicApplication.getInstance().getDownLoadImageList().contains(mUrl)) return;
				//下载图片
				Log.e(MosJoyAdApplication.TAG, "从网络下载图片 " + url);
				Map<String,Object> map = new HashMap<String,Object>();
				map.put("url", mUrl);
				map.put("file", f);
				try{
					new DownloadTask().execute(map);
				}catch(Exception e){}
			}
		}

	}

	public void setDefaultImage(Integer resid) {
		mDefaultImage = resid;
	}

	private void loadDefaultImage() {
		if (mDefaultImage != null)
			setImageResource(mDefaultImage);
	}
	
	class DownloadTask extends AsyncTask<Map<String, Object>,Void, Bitmap>{

		private String mTaskUrl;
		private File f;
		
		@Override
		public void onPreExecute() {
			loadDefaultImage();
			super.onPreExecute();
		}
		
		@Override
		protected Bitmap doInBackground(Map<String, Object>... params) {
			mTaskUrl = params[0].get("url").toString();
			//YYQMusicApplication.getInstance().getDownLoadImageList().add(mTaskUrl);
			f = (File) params[0].get("file");
			try {
	            Bitmap bitmap=null;
	            URL imageUrl = new URL(mTaskUrl);
	            HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
	            conn.setConnectTimeout(30000);
	            conn.setReadTimeout(30000);
	            InputStream is=conn.getInputStream();
	            OutputStream os = new FileOutputStream(f);
	            Utils.CopyStream(is, os);
	            os.close();
	            bitmap = decodeFile(f);
	            return bitmap;
	        } catch(FileNotFoundException fileNotFoundException){
	        	fileNotFoundException.printStackTrace();
	        	return null;
	        }
			catch (Exception ex){
	           ex.printStackTrace();
	        }
			return null;
		}
		
		@Override
		public void onPostExecute(Bitmap b) {
			super.onPostExecute(b);
			if(b == null){
				//下载失败,继续下载
				//RemoteImageView.this.setImageUrl(mTaskUrl);
			}else{
				//下载成功
				MosJoyAdApplication.getInstance().getImageCache().put(mTaskUrl, new SoftReference<Bitmap>(b));
				RemoteImageView.this.setImageBitmap(b);				
				mCurrentlyGrabbedUrl = mTaskUrl;				
			}
		}
		
	};

	/**
	 * 解码图片
	 * @param f
	 * @return
	 */
	private Bitmap decodeFile(File f) {
		if(!f.exists()){
			return null;
		}
		if(pwidth>0&&pheight>0){
			System.out.println("加载缩略图");
			return decodeFile(f, pwidth, pheight);
		}
		try {
			BitmapFactory.Options options = new BitmapFactory.Options();
			options.inSampleSize = 1;
			return BitmapFactory.decodeFile(f.getAbsolutePath(), options);
		} catch (Exception e) {
		}
		return null;
	}

	private int freeSpaceOnSd() {
		StatFs stat = new StatFs(Environment.getExternalStorageDirectory()
				.getPath());
		double sdFreeMB = ((double) stat.getAvailableBlocks() * (double) stat
				.getBlockSize()) / MB;

		return (int) sdFreeMB;
	}
	
	private Bitmap decodeFile(File file,int width,int height){
    	BitmapFactory.Options options=new BitmapFactory.Options();
    	int scale=1;
    	if(width>0||height>0){
    		//设置次参数为true,解码时返回的Bitmap为空,不分配内存
        	options.inJustDecodeBounds=true;
        	BitmapFactory.decodeFile(file.getAbsolutePath(), options);
        	//得到原始图片的宽度和高度
        	int outWidth=options.outWidth;
        	int outHeight=options.outHeight;
        	while(true){
        		if((width>0&&outWidth/2<width)||(height>0&&outHeight/2<height)){
        			break;
        		}
        		outWidth/=2;
        		outHeight/=2;
        		scale*=2;
        	}
    	}
    	//缩放比例为1/scale
    	options.inSampleSize=scale;
    	options.inJustDecodeBounds=false;
    	//处理之后,加载进内存的就是图片的缩略图
    	return BitmapFactory.decodeFile(file.getAbsolutePath(), options);
    }

	public void setPwidth(int pwidth) {
		this.pwidth = pwidth;
	}

	public void setPheight(int pheight) {
		this.pheight = pheight;
	}

	public void setShowDefault(boolean isShowDefault) {
		this.isShowDefault = isShowDefault;
	}

}


网友评论    (发表评论)

共1 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...