仓酷云
标题:
IOS教程之Android 异步加载收集图片并缓存到当地 软援用 进修分享仓酷云 ...
[打印本页]
作者:
小魔女
时间:
2015-1-18 11:35
标题:
IOS教程之Android 异步加载收集图片并缓存到当地 软援用 进修分享仓酷云 ...
CoreAnimation---制作动画很强大很喜欢的框架可以用少量的代码写出漂亮的动画CQuartz2D---强大的2D绘图库COpenGL---不用介绍了超级强大的3D库CCoreImage---在android使用开辟的时分,加载收集图片是一个十分主要的部分,良多图片不成能放在当地,以是就必需要从服务器大概收集读取图片。
软援用是一个如今十分盛行的办法,用户体验对照好,不必每次都必要从收集下载图片,假如下载后就存到当地,下次读取时起首检察当地有无,假如没有再从收集读取。
记得2月份在和爱奇艺公司的项目总监一同弄联通的OTT盒子的时分他就提了一下软援用,奇艺做的手机客户端就是接纳这类办法,以是你会发明奇艺客户端占用很年夜的空间,上面就分享一下异步加载收集图片的办法吧。
FileCache.java
importjava.io.File;
importandroid.content.Context;
publicclassFileCache{
privateFilecacheDir;
publicFileCache(Contextcontext){
//找一个用来缓存图片的路径
if(android.os.Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED))
cacheDir=newFile(android.os.Environment.getExternalStorageDirectory(),
"文件夹称号");
else
cacheDir=context.getCacheDir();
if(!cacheDir.exists())
cacheDir.mkdirs();
}
publicFilegetFile(Stringurl){
Stringfilename=String.valueOf(url.hashCode());
Filef=newFile(cacheDir,filename);
returnf;
}
publicvoidclear(){
File[]files=cacheDir.listFiles();
if(files==null)
return;
for(Filef:files)
f.delete();
}
}
HttpUtil.java
importjava.io.ByteArrayOutputStream;
importjava.io.File;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.io.UnsupportedEncodingException;
importjava.net.HttpURLConnection;
importjava.net.MalformedURLException;
importjava.net.ProtocolException;
importjava.net.URL;
importjava.net.URLEncoder;
importjava.util.Map;
/**
*Http哀求工具类
*
*@authorScorpio.Liu
*
*/
publicclassHttpUtil{
/**
*猎取呼应字符串
*
*@parampath
*路径
*@paramparameters
*参数
*@return呼应字符串
*/
publicstaticStringgetResponseStr(Stringpath,Map<String,String>parameters){
StringBufferbuffer=newStringBuffer();
URLurl;
try{
if(parameters!=null&&!parameters.isEmpty()){
for(Map.Entry<String,String>entry:parameters.entrySet()){
//完成转码操纵
buffer.append(entry.getKey()).append("=")
.append(URLEncoder.encode(entry.getValue(),"UTF-8")).append("&");
}
buffer.deleteCharAt(buffer.length()-1);
}
url=newURL(path);
HttpURLConnectionurlConnection=(HttpURLConnection)url.openConnection();
urlConnection.setConnectTimeout(3000);
urlConnection.setRequestMethod("POST");
urlConnection.setDoInput(true);//暗示从服务器猎取数据
urlConnection.setDoOutput(true);//暗示向服务器写数据
//取得上传信息的字节巨细和长度
byte[]mydata=buffer.toString().getBytes();
//暗示设置哀求体的范例是文本范例
urlConnection.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
urlConnection.setRequestProperty("Content-Length",String.valueOf(mydata.length));
//取得输入流,向服务器输入数据
OutputStreamoutputStream=urlConnection.getOutputStream();
outputStream.write(mydata,0,mydata.length);
outputStream.close();
intresponseCode=urlConnection.getResponseCode();
if(responseCode==200){
returnchangeInputStream(urlConnection.getInputStream());
}
}catch(UnsupportedEncodingExceptione){
e.printStackTrace();
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(ProtocolExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
returnnull;
}
privatestaticStringchangeInputStream(InputStreaminputStream){
ByteArrayOutputStreamoutputStream=newByteArrayOutputStream();
byte[]data=newbyte[1024];
intlen=0;
Stringresult="";
if(inputStream!=null){
try{
while((len=inputStream.read(data))!=-1){
outputStream.write(data,0,len);
}
result=newString(outputStream.toByteArray(),"UTF-8");
}catch(IOExceptione){
e.printStackTrace();
}
}
returnresult;
}
publicstaticInputStreamgetInputStream(Stringpath){
URLurl;
try{
url=newURL(path);
HttpURLConnectionurlConnection=(HttpURLConnection)url.openConnection();
urlConnection.setConnectTimeout(3000);
urlConnection.setRequestMethod("GET");
urlConnection.setDoInput(true);//暗示从服务器猎取数据
urlConnection.connect();
if(urlConnection.getResponseCode()==200)
returnurlConnection.getInputStream();
}catch(MalformedURLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnnull;
}
publicstaticbyte[]readStream(InputStreaminStream)throwsException{
ByteArrayOutputStreamoutSteam=newByteArrayOutputStream();
byte[]buffer=newbyte[1024];
intlen=-1;
while((len=inStream.read(buffer))!=-1){
outSteam.write(buffer,0,len);
}
outSteam.close();
inStream.close();
returnoutSteam.toByteArray();
}
publicstaticvoidCopyStream(Stringurl,Filef){
FileOutputStreamfileOutputStream=null;
InputStreaminputStream=null;
try{
inputStream=getInputStream(url);
byte[]data=newbyte[1024];
intlen=0;
fileOutputStream=newFileOutputStream(f);
while((len=inputStream.read(data))!=-1){
fileOutputStream.write(data,0,len);
}
}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}finally{
if(inputStream!=null){
try{
inputStream.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
if(fileOutputStream!=null){
try{
fileOutputStream.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}
}
MemoryCache.java
importjava.lang.ref.SoftReference;
importjava.util.Collections;
importjava.util.HashMap;
importjava.util.Map;
importandroid.graphics.Bitmap;
publicclassMemoryCache{
privateMap<String,SoftReference<Bitmap>>cache=Collections
.synchronizedMap(newHashMap<String,SoftReference<Bitmap>>());//软援用
publicBitmapget(Stringid){
if(!cache.containsKey(id))
returnnull;
SoftReference<Bitmap>ref=cache.get(id);
returnref.get();
}
publicvoidput(Stringid,Bitmapbitmap){
cache.put(id,newSoftReference<Bitmap>(bitmap));
}
publicvoidclear(){
cache.clear();
}
}
ImageLoader.java
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.UnsupportedEncodingException;
importjava.net.URLEncoder;
importjava.util.Collections;
importjava.util.Map;
importjava.util.WeakHashMap;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.graphics.drawable.BitmapDrawable;
importandroid.widget.ImageView;
publicclassImageLoader{
privateMemoryCachememoryCache=newMemoryCache();
privateFileCachefileCache;
privateMap<ImageView,String>imageViews=Collections
.synchronizedMap(newWeakHashMap<ImageView,String>());
privateExecutorServiceexecutorService;
privatebooleanisSrc;
/**
*@paramcontext
*高低文对象
*@paramflag
*true为source资本,false为background资本
*/
publicImageLoader(Contextcontext,booleanflag){
fileCache=newFileCache(context);
executorService=Executors.newFixedThreadPool(5);
isSrc=flag;
}
finalintstub_id=R.drawable.ic_launcher;
publicvoidDisplayImage(Stringurl,ImageViewimageView){
Stringu1=url.substring(0,url.lastIndexOf("/")+1);
Stringu2=url.substring(url.lastIndexOf("/")+1);
try{
u2=URLEncoder.encode(u2,"UTF-8");
}catch(UnsupportedEncodingExceptione){
e.printStackTrace();
}
url=u1+u2;
imageViews.put(imageView,url);
Bitmapbitmap=memoryCache.get(url);
if(bitmap!=null){
if(isSrc)
imageView.setImageBitmap(bitmap);
else
imageView.setBackgroundDrawable(newBitmapDrawable(bitmap));
}else{
queuePhoto(url,imageView);
if(isSrc)
imageView.setImageResource(stub_id);
else
imageView.setBackgroundResource(stub_id);
}
}
privatevoidqueuePhoto(Stringurl,ImageViewimageView){
PhotoToLoadp=newPhotoToLoad(url,imageView);
executorService.submit(newPhotosLoader(p));
}
privateBitmapgetBitmap(Stringurl){
try{
Filef=fileCache.getFile(url);
//从sd卡
Bitmapb=onDecodeFile(f);
if(b!=null)
returnb;
//从收集
Bitmapbitmap=null;
System.out.println("ImageLoader-->download");
HttpUtil.CopyStream(url,f);
bitmap=onDecodeFile(f);
returnbitmap;
}catch(Exceptionex){
ex.printStackTrace();
returnnull;
}
}
publicBitmaponDecodeFile(Filef){
try{
returnBitmapFactory.decodeStream(newFileInputStream(f));
}catch(FileNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnnull;
}
/**
*解码图象用来削减内存损耗
*
*@paramf
*@return
*/
publicBitmapdecodeFile(Filef){
try{
//解码图象巨细
BitmapFactory.Optionso=newBitmapFactory.Options();
o.inJustDecodeBounds=true;
BitmapFactory.decodeStream(newFileInputStream(f),null,o);
//找到准确的刻度值,它应当是2的幂。
finalintREQUIRED_SIZE=70;
intwidth_tmp=o.outWidth,height_tmp=o.outHeight;
intscale=1;
while(true){
if(width_tmp/2<REQUIRED_SIZE||height_tmp/2<REQUIRED_SIZE)
break;
width_tmp/=2;
height_tmp/=2;
scale*=2;
}
BitmapFactory.Optionso2=newBitmapFactory.Options();
o2.inSampleSize=scale;
returnBitmapFactory.decodeStream(newFileInputStream(f),null,o2);
}catch(FileNotFoundExceptione){
}
returnnull;
}
/**
*义务行列
*
*@authorScorpio.Liu
*
*/
privateclassPhotoToLoad{
publicStringurl;
publicImageViewimageView;
publicPhotoToLoad(Stringu,ImageViewi){
url=u;
imageView=i;
}
}
classPhotosLoaderimplementsRunnable{
PhotoToLoadphotoToLoad;
PhotosLoader(PhotoToLoadphotoToLoad){
this.photoToLoad=photoToLoad;
}
@Override
publicvoidrun(){
if(imageViewReused(photoToLoad))
return;
Bitmapbmp=getBitmap(photoToLoad.url);
memoryCache.put(photoToLoad.url,bmp);
if(imageViewReused(photoToLoad))
return;
BitmapDisplayerbd=newBitmapDisplayer(bmp,photoToLoad);
Activitya=(Activity)photoToLoad.imageView.getContext();
a.runOnUiThread(bd);
}
}
booleanimageViewReused(PhotoToLoadphotoToLoad){
Stringtag=imageViews.get(photoToLoad.imageView);
if(tag==null||!tag.equals(photoToLoad.url))
returntrue;
returnfalse;
}
/**
*显现位图在UI线程
*
*@authorScorpio.Liu
*
*/
classBitmapDisplayerimplementsRunnable{
Bitmapbitmap;
PhotoToLoadphotoToLoad;
publicBitmapDisplayer(Bitmapb,PhotoToLoadp){
bitmap=b;
photoToLoad=p;
}
publicvoidrun(){
if(imageViewReused(photoToLoad))
return;
if(bitmap!=null){
if(isSrc)
photoToLoad.imageView.setImageBitmap(bitmap);
else
photoToLoad.imageView.setBackgroundDrawable(newBitmapDrawable(bitmap));
}else{
if(isSrc)
photoToLoad.imageView.setImageResource(stub_id);
else
photoToLoad.imageView.setBackgroundResource(stub_id);
}
}
}
publicvoidclearCache(){
memoryCache.clear();
fileCache.clear();
}
}
利用的时分用ImageLoader这个类就ok了,很便利
最重要的就是UINavigationController他是一层一层推进view的打开iPhone里的联系人每点一个联系人屏幕就会像右推到下一个界面这就是UINavigationController在做的事UINavigationController
作者:
灵魂腐蚀
时间:
2015-1-26 20:19
培训时可以选择安卓,iOS,Java,因为实习的时候我选了安卓,当时实习时间只有三周,学的晕头转向,而java我也没学过,iOS的基础是C语言,这个大学里还是学过的,于是选择了iOS。
作者:
冷月葬花魂
时间:
2015-1-29 06:54
才在自己的Windows电脑上安装配置成功了一个完美的Mac OS X Lion(10.7.4)系统,而且下载了Xcode4.5的最新版本。虽然不能实机调试,但是作为iOS开发学习已经非常完美了。
作者:
第二个灵魂
时间:
2015-2-3 13:49
AD: iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。
作者:
山那边是海
时间:
2015-2-9 02:12
开始的时候甚至想放弃,不过想想自己的未来,只能咬牙坚持,课下就不停的缠着老师。放学就补基础,这些基础的东西没有速成的,只有刻苦努力。我是后来发现的,转变自己的心态,不要读书看资料当成一种痛苦
作者:
变相怪杰
时间:
2015-2-19 00:48
有办法利用自己手头的电脑立刻开始这个美妙旅程的。
作者:
飘飘悠悠
时间:
2015-3-6 11:28
特别是在校的学生,都存在一个小小的尴尬——虽然学习iOS开发的热情高涨,但由于没有多余的银子购买昂贵的Mac电脑而踟蹰不前。其实,针对初学者,如果想进入iOS开发的天地
作者:
仓酷云
时间:
2015-3-10 19:20
开始的时候甚至想放弃,不过想想自己的未来,只能咬牙坚持,课下就不停的缠着老师。放学就补基础,这些基础的东西没有速成的,只有刻苦努力。我是后来发现的,转变自己的心态,不要读书看资料当成一种痛苦
作者:
蒙在股里
时间:
2015-3-17 02:09
以上可以同时进行,学习过程中尽量不要纠结细节和底层,要知道ios是封闭的、OC是高级语言,我们不可能过多地去了解它的原理,至少在新手阶段没有必要。用迭代的方式更新你的知识,而不是死抠一个知识点。
作者:
海妖
时间:
2015-3-23 13:36
最后在做项目的时候一定要认真对待,毕竟这个直接和你的就业挂钩,这也是锻炼你实际操作的能力。
作者:
因胸联盟
时间:
2015-3-31 00:56
要学会通过各种方法将面前的事情变成自己感兴趣的,那专研起来就不会是无聊和折磨了。
作者:
透明
时间:
2015-4-7 20:37
特别是在校的学生,都存在一个小小的尴尬——虽然学习iOS开发的热情高涨,但由于没有多余的银子购买昂贵的Mac电脑而踟蹰不前。其实,针对初学者,如果想进入iOS开发的天地
作者:
若相依
时间:
2015-4-12 19:49
要学会通过各种方法将面前的事情变成自己感兴趣的,那专研起来就不会是无聊和折磨了。
作者:
小魔女
时间:
2015-4-16 01:37
培训时可以选择安卓,iOS,Java,因为实习的时候我选了安卓,当时实习时间只有三周,学的晕头转向,而java我也没学过,iOS的基础是C语言,这个大学里还是学过的,于是选择了iOS。
作者:
分手快乐
时间:
2015-4-20 19:11
每个行业都一样,想要一天学有所成是不可能的,一定要做好努力的准备,做ios不是简单的学会oc语言。不怕多走弯路,就怕不肯动手。
作者:
爱飞
时间:
2015-4-21 00:31
down下code4app网站的每个分类的代码挨着看
作者:
小妖女
时间:
2015-4-26 10:08
要学会通过各种方法将面前的事情变成自己感兴趣的,那专研起来就不会是无聊和折磨了。
作者:
若天明
时间:
2015-5-6 23:09
同很多iOS开发者一样,我也是通过培训进入到iOS开发这个行业,开始没有打算培训,只准备自己学习一些计算机编程相关的知识,毕业时找一份编程相关工作(本人是信息与计算科学这个专业,是数学系)。
作者:
活着的死人
时间:
2015-6-15 19:25
看完这个你就可以有多种选择来踏入做应用的阶段
作者:
再见西城
时间:
2015-6-18 20:08
同很多iOS开发者一样,我也是通过培训进入到iOS开发这个行业,开始没有打算培训,只准备自己学习一些计算机编程相关的知识,毕业时找一份编程相关工作(本人是信息与计算科学这个专业,是数学系)。
欢迎光临 仓酷云 (http://www.ckuyun.com/)
Powered by Discuz! X3.2