android编程实现图片库的封装方法
本文实例讲述了android编程实现图片库的封装方法。分享给大家供大家参考,具体如下:
大家在做安卓应用的时候经常要从网络中获取图片都是通过URL去获取可是如果本地有图片数据从本地获取数据不更加快一些自己在工作中遇到这个问题所以采用了一个URL和本地图片的一个映射关系先从本地区获取假如本地没有再从网络中获取本方法考虑到多线程问题欢迎大家一起共同探讨!
publicclassPictureLibrary{
/*
*图片库的操作
*/
Filefile;
URLurl;
HttpURLConnectionconn;
InputStreamis;
FileOutputStreamfos;
privateLocklock=newReentrantLock();
privateConditiondownFile=lock.newCondition();
//通过URL将数据下载到本地操作
privateStringtoLocalFile(StringstrURL){
StringfileName=Utils.getFileName(strURL);
Stringpath=Environment.getExternalStorageDirectory()+"/"
+EcologicalTourism.FILE_PATH+"/images/"+fileName;
returnpath;
}
//通过URL将数据下载到本地临时文件中
privateStringtoLocalFileTemp(StringstrURL){
Strings=Utils.getFileName(strURL);
StringfileName=s+"temp";
Stringpath_url=Environment.getExternalStorageDirectory()+"/"
+EcologicalTourism.FILE_PATH+"/tempimages/"+fileName;
returnpath_url;
}
/*
*保存图片到本地,并返回本地url(此函数是阻塞的)
*main
*@参数:strURL,参数为图片的URL.返回值:该图片在本地SD卡暂存的位置
*函数的工作是负责将图片从互联网上取得,存在本地存储中,并返回本地存储的文件路径,供调用者直接使用。如果文件已经存在本地,直接返回
*如果文件未在本地,则直接从服务器下载,函数阻塞。
*/
publicStringgetReadSD(StringstrURL){
Log.i("test","拿到网络的地址是:"+strURL);
StringstrLocalFile=toLocalFile(strURL);//k:把服务器URL转换为本地URL
StringstrLocalFileTemp=toLocalFileTemp(strURL);//k:把服务器URL转换为本地临时URL
while(true){
Filefile=newFile(strLocalFile);
Log.i("test","本地文件是:"+strLocalFile);
Filetfile=newFile(strLocalFileTemp);
Log.i("test","临时文件是:"+strLocalFileTemp);
//1上锁
lock.lock();
if(file.exists()){
//2if本地文件存在
//解锁
//返回本地路径
lock.unlock();
Log.i("test","返回本地路径:"+file);
returnstrLocalFile;
}elseif(tfile.exists()){
//if对应的暂存文件存在
//解锁
lock.unlock();
try{
//睡眠
downFile.await();
}catch(Exceptione){
e.printStackTrace();
Log.i("test","e出现了异常1"+e);
}
}else{
try{
//创建对应的暂存文件
tfile.createNewFile();
}catch(IOExceptione){
Log.i("test","e出现了异常2"+e);
}
//解锁
lock.unlock();
//下载文件内容到暂存文件中
downURL2(strURL,strLocalFile);
//上锁
lock.lock();
//修改暂存文件名字为本地文件名
tfile.renameTo(file);
//解锁
lock.unlock();
}
}
}
privatevoiddownURL2(StringstrURL,StringstrLocalFileTemp){
//TODOAuto-generatedmethodstub
URLurl;
try{
url=newURL(strURL);
HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
conn.setDoInput(true);
if(conn.getResponseCode()==200){
InputStreamis=conn.getInputStream();
FileOutputStreamfos=newFileOutputStream(strLocalFileTemp);
byte[]buffer=newbyte[1024];
intlen=0;
while((len=is.read(buffer))!=-1){
fos.write(buffer,0,len);
}
is.close();
fos.close();
//返回一个URI对象
}
}catch(MalformedURLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(ProtocolExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
/*
*阻塞式下载url到文件toFile中
*/
privatebooleandownURL(StringstrURL,StringtoFile){
URLurl;
try{
url=newURL(strURL);
HttpURLConnectionhttpUrl=(HttpURLConnection)url
.openConnection();
httpUrl.setRequestMethod("GET");
intfileSize=httpUrl.getContentLength();//文件大小
httpUrl.disconnect();//关闭连接
intthreadSize=6;//默认设置6个线程
threadSize=fileSize%threadSize==0?threadSize
:threadSize+1;
intcurrentSize=fileSize/threadSize;//每条线程下载大小
Stringdowloadir=Environment.getExternalStorageDirectory()+"/"
+EcologicalTourism.FILE_PATH+"/images/";
Filedir=newFile(dowloadir);
if(!dir.exists()){
dir.mkdirs();
}
Filefile=newFile(dir,toFile);
RandomAccessFilerandomFile=newRandomAccessFile(file,"rw");
randomFile.setLength(fileSize);//指定file文件的大小
for(inti=0;i<threadSize;i++){
intstartposition=i*currentSize;//每条线程开始写入文件的位置
RandomAccessFilethreadFile=newRandomAccessFile(file,"rw");
Log.i("syso","toFile的内容是:"+toFile);
threadFile.seek(startposition);
newDownLoadThread(i,currentSize,threadFile,startposition,
url).start();
}
}catch(Exceptione){
e.printStackTrace();
Log.i("syso","download下载失败"+e);
}
returntrue;
}
/**
*实现线程下载
*
*/
privatestaticclassDownLoadThreadextendsThread{
@SuppressWarnings("unused")
privateintthreadId;//线程编号
privateintcurrentSize;//每条线程的大小
privateRandomAccessFilethreadFile;//每条线程要写入文件类
privateintstartposition;//每条线程开始写入文件的位置
privateURLurl;//网络地址
publicDownLoadThread(intthreadId,intcurrentSize,
RandomAccessFilethreadFile,intstartposition,URLurl){
this.threadId=threadId;
this.currentSize=currentSize;
this.threadFile=threadFile;
this.startposition=startposition;
this.url=url;
}
publicvoidrun(){
try{
HttpURLConnectionhttpUrl=(HttpURLConnection)url
.openConnection();
httpUrl.setRequestMethod("GET");
httpUrl.setRequestProperty("range","bytes="+startposition
+"-");//指定服务器的位置
InputStreamis=httpUrl.getInputStream();
byte[]data=newbyte[1024];
intlen=-1;
intthreadFileSize=0;
while((threadFileSize<currentSize)
&&((len=is.read(data))!=-1)){
threadFile.write(data,0,len);
threadFileSize+=len;
}
httpUrl.disconnect();
is.close();
}catch(Exceptione){
e.printStackTrace();
}
}
}
/**
*从本缓存中获取图片
*/
publicBitmapgetBitmapFromCache(StringimageURL){
//StringbitmapName=imageURL.substring(imageURL.lastIndexOf("/")+1);
StringbitmapName=Utils.getFileName(imageURL);
FilecacheDir=newFile(Environment.getExternalStorageDirectory()+"/"
+EcologicalTourism.FILE_PATH+"/images/");
File[]cacheFiles=cacheDir.listFiles();
inti=0;
if(null!=cacheFiles){
for(;i<cacheFiles.length;i++){
if(bitmapName.equals(cacheFiles[i].getName())){
break;
}
}
if(i<cacheFiles.length)
{
returnBitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/"
+EcologicalTourism.FILE_PATH+"/images/"+bitmapName);
}
}
returnnull;
}
希望本文所述对大家Android程序设计有所帮助。