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; |
} |
} |
中级程序员
by: 3Kings 发表于:2013-07-24 09:49:31 顶(1) | 踩(0) 回复
走一走 看一看喽。。
回复评论