版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android讲课第25一、什么是LruCache?LruCacheLru的全称是LeastAndroid讲课第25一、什么是LruCache?LruCacheLru的全称是LeastRecentlyUsed LruCache的实现原理:把近期最少使用的数据从缓存中移除,保留使用最频繁的数据。讲到uCach不得不提一下nkahMa,因为uCach中u算法的实现就是通过nkahMa来实现的。nkahMa继承于ahMa,它使用了一个双向链表来存储Ma中的En顺序关系,这种顺序有两种:这可以由其构造函数ucnkahMantntaCaact,fataFact,anacc指定。所以,对于t、ut、me等操作,nkahMap除了要做ahMap做的事情,还做些调整Ent顺序链表的工作。uCach中将nkahMa的顺序设置为U顺序来实现U缓存,每次调用t片,则将该对象移到链表的尾端。调用u将链表头部的对象(近期最少用到的)/liuling/archive/2015/09/24/2015-9-24-总1、LruCacheLru创建1. version="1.0 encoding="utf-<orF<!--Baseapplication<!--Baseapplicationtheme-- n<!--Cstoizyourthemhere--RelativeLayoutxmlns:android="/apk/res/android"ooeet"candroid:text="加载图片"Iaeeee@uandroid:src="@mipmap/ic_launcher"/>Layt>ublicasMainActivityextendsAppCompatActivityfnasttiStringTAG="MainActivity";Contextmote=thi;gString =Cn"LruCache<String,Bitmap>luCah=ulMap<String,SoftReference<Bitmap>>softReferenceMap=newHashMap<String,ProgressDialogpd=nullHandlerhandler=newHandler();protectedvionCreate(Bundle{super.onCreate(savedInstanceState);activity_main//初始化//初始化缓}pivatvoiinitLruCache()//得到内存lonmaxMemory=//newLruCache<String,//缓存不同的数据,//newLruCache<String,//缓存不同的数据,需要重写sizeOf方法。比如,上面缓存的是//。本质上,这些数据都是存储在内存中的,因此,cacheSize不宜过大uCah=newLruCache<String,(int)maxMemory/8)he以键值对的形式,初始化时,需要设置缓存的大小K,超过这个大小的数据将会被清除。注意:清除的数据,是那些被先加入的数据。ce内部的数据结构是nda存储的。这样,ce就达到了缓存最近p的个数据protectedinsizeOf(Stringkey,Bitmapvalue)//value.getRowBytes()用于计算位图每一行所占用的内存字节 得到高indata=value.getRowBytes()*return}}rvatvoiinitView()im=(ImageView)eimg thisic_launcherpd.setTitle("提示pd.setMessage("数据加载 }pubivoiclickButton(View{if(v.getId()==R.id.btn)//清空ifimg.getDrawable()==null{imnull}Bitmapbitmap=l//从缓存中寻找图bitmap=urlPaththis (bitmap!={img}els//缓存中没//下面从网络中进行加//显示加载对话ifpd{pd}//网络加载,这是一个耗时任务,开启一个线程来完newThread(new{ublioirun()byte[]data=.demurlPath//这个bm是从网络中加载出一来的原fnaBitmapbm=BitmapFactory.decodeByteArray(data,,data.length);TAG,">bm:+bm.getByteCount());if(bm!=null)//将原图放到sd卡beaflag=urlPathurlPath.lastIndexOf("/")+1),etif(flag)//保存成功,创建缩略图并放到缓存lruCacheStringfilePaht=mContextBitmapbm_thumbnail=50,TAG,">bm_thumbnai:+if(bm_thumbnail!=nullluCachurlPath,TAG,">网络加载的图片被保存进LCh"}}elsTAG,">网络加载的图片被保存进SD卡失败!"}}handlernew{ublioirun()TAG,">将网络ublioirun()TAG,">将网络加载的图片显示出来");imgif(pd{pd}}}}}}//从缓存中寻找图rvatBitmapgetBitmapFromCache(Stringkey,StringfileCachePath)//先从强引用中找Bitmapbm=bm=uCaheee)if(bm!=null){TAG"图片在lruCache中找到");returnbm;}els//从文件缓存中找Filefile=newif(file.exists())byte[]data=if(data!=null)bm=BitmapFactory.decodeByteArray(data,,//对图片进行二次采样,生成缩略图,防止加载过大图片出现内存溢Bitmapbm_thumbnail=BitmapThumbnailHelper.createThumbnail(data,,0);TAG,">bm_thumbnail2:"+bm_thumbnail.getByteCount());TA,">bm:+bm.getByteCount()); (bm!={luCachebm_thumbnail);TAG,">SD卡找到图片");return}}}}returnl}应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcrd中的。大部分应用是直接在SDCd的根目录下创建一个文件夹,然后把数据保存在该文件夹中。这样当该应用被卸载后,这些数据还保留在SDCd中,留下了垃圾数据。如果你想让你的应用被卸载后,与该应用相关的数据也清除掉,该怎么办通过Context.getExternalFilesDir()方法可以获取到SDCard/Android/data/你的应用的包名/files/目录,一通过Context.getExternalCacheDir()方法可以获取到SDCard/Android/data/你的应用包名/cache/目录,一般如果使用上面的方法,当你的应用在被用户卸载后,SDCard/Android/data/你的应用的包名/这个目录下的所不会留下垃圾信息。而且上面二个目录分别对设置->应用->应用详情里面的”清除数据“与”清除缓存“项pivatStringgetFileCachePath(Contextcontext)StringfileName=uPaturlPathreturncontext.getExternalCacheDir().getAbsolutePath()+}}5SDCardHelper.java//sd卡操作工具HttpURLConnHelper.java//网络加载工具BitmapThumbnailHelper.java//缩图工6<uses-permi6<uses-permissionandroid:name="android.permission.INTERNETpermissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGEpermissionandroid:name="android.permission.READ_EXTERNAL_STORAGE二、大位图二次采样压缩处理 OutofMemory内存不足/在中显示图片一般使用,通过、等方法指定要显示的对象,而这些方法最终都会调用到ee方法来生成一个进行显示。对于一般的小图片这样使用没有什么问题,因为垃圾回收器会及时将不用的图片进行回收,但连续加载大图片的时候就会发生典型的问题,也就是内存溢出,这是因为在致程序崩溃。因此要避免OOM的问题就需要对大图片的加载进行管理,主要通过缩放来减小图片的内存占用Bitmap的缩生成Bitmap都要通过BitmapFactory的decode()方法,使用此方法时可以传入一个解析参数BitmapFactory.Option来对控制解析过程,比如获得长宽、改变采样率、改变采样格式等。而对Bitmap的缩放就是通过改变采样率来实创建1. versio1. version="1.0 encoding="utf-<orF<!--Baseapplicationtheme-- n<!--Cstoizyourthemhere--<tm<RelativeLayoutxmlns:android="/apk/res/android"ooeetandroid:textSize="20sp"/>@android:layout_below="@id/tv1"/>tandroid:textSize="20sp"/>android:layout_below="@id/tv2"/>twtubcasMainActivityextendsubcasMainActivityextendsAppCompatActivityprvtfinastttrUL_TR=privteaVeimg_original;privteaVeimg_thumbnail;BtmoriginalBitmap;//原BmthumbnailBitmap;//采样后的privteHehnd=newHndle{pubivoihandleMessage(Message{if(.wh==0x200){}}protectedvoionCreate(BundlesavedInstanceState{supe.nCeatesavedInstancette)ND}pivatviinitView(img_origina (ImageView findViewById(R.id.img_original)img_thumbnail=(ImageView)findViewById(R.id.img_thumbnail);}prvtvoiloadNetworkData()//开一个线程加载网络图片newea(e{ublivoirun()//从网络上加载原图byte[]data=//生成原originalBitma//生成缩略=BitmapFactory.decodeByteArray(data,0)=Bitmap.Config.ALPHA_8指明色彩的存储方法createThumbnailBitmap(data,050thumbnailBitma//处理完成,下面通知handler进行图片显}}*缩略图生成方法**param生成缩略图的数据*param 缩略图的最大高param 缩略图的最大宽*param缩略图的色彩方** 返回一个生成的缩略图pivatBitmcreateThumbnailBitmap(byte[]dtainmaxHhtinmaxWthBitmap.Configconf{//生成采集时的参数选项对象BitmapFactory.Optionspton=new//设置第一次采样时候只采集边界options.inJustDecodeBounds=//执行第一次采样//设置inJustDecodeBounds为true后,并不分配空间,但可计算出原始图片的长度和宽度BitmapFactory.decodeByteArray(data,0data.length,options);//options是采样时的采样参数对//获取原图的宽度和高度 op//获取原图的宽度和高度 options.outWidth //计算缩放比例,inSampleSize指定了下一次采集时的缩放比例inrationWidth=0rationHeight=0if(xHeih==0&&maxdt==0)options.inSampleSize=}elsif(xHegh==0&&maxWdt!={rationWidth=ldWidt/axWidthoptions.inSampleSiz elsif(xHegh!=0&&maxdt==}{rationHeight=leih/axHeightoptions.inSampleSiz rationHeightelserationHeight=Heg/maxHeghtrationWidt options.inSampleSize=(rationHeigh >tW }:}//设置图片色彩质量options.inPreferredConfig=//执行第二次彩样,这次不仅仅是采集边界,而是全部采样噢options.inJustDecodeBounds=//按options要求进行一次采集图像后返回Bitmap对returnBitmapFactory.decodeByteArray(data,0data.length,}**@papahNameaamxHeh@aamaxWit@aaofi****prvttmcreateThumbnail(StringpNmeinxetinxWthBitmap.Configcofg{BitmapFactory.Optionspton=new 设置第一次采样的时候只采集边界数据options.inJustDecodeBounds=//执行第一次采样BitmapFactory.decodeFile(pathName,//获取原图的宽度和高度 options.outWidth //计算缩放比inWit=0ratioHeigh=0if(xHegh==0&&maxdt==0)options.inSampleSize=}elsif(xHegh==0&&maxWdt!={iWi=lWit/mhoptions.inSampleSiz elsif(xHegh!=0&&maxdt=={atioHeigh=leih/axHeightoptions.inSampleSiz ratioHeightelseratioidt=lWidt/ratioHeigh=ldeih/options.inSampleSize=(ratioHeight>iWit?:}}}//设置图片的质量options.inPreferredConfig=//执行第2次采样options.inJustDecodeBounds=returnBitmapFactory.decodeFile(pathName,}}4HttpURLConnHelper工具类同上一个案<uses-m <uses-m android:name="android.permission.INTERNET三在Android手机中内置了一款高性能webkit内核浏览器,在SDK中封装为一个叫做WebView组件什么是ebi是一个开源项目,主要由KDE的KHTML修改而来并且包含了一些来自苹果公司的一些组件传统上,WebKit包含一个网页引擎WebCore和一个脚本引擎JavaScriptCore,它们分别对应的是KDE的KHTML和KJS.不过,随着JavaScript引擎的独立性越来越强,现在WebKit和WebCore已经基本上混用不分(例如GoogleChrome和Maxthon3采用V8引擎,却仍然宣称自己是WebKit内核).AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Webpagenotavailable错误如果访问的页面中有Javascript,则WebView必须设置支持E如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖WebView的WebViewClient对象.returntrue;}网页回退而不ActivityBack事件.publicbooleanonKeyDown(intkeyCode,KeyEventevent)if((keyCode==KeyEvent.KEYCODE_BACK)&&returntrue;}returnsuper.onKeyDown(keyCode,}android中bV是如何支持javascripte自定义对象的,在w3c标准中js有wn,history,等标准对象,同样我们可以在开发浏览器时自己定义我们的对象调用手机系统功能来处理,这样使欲为了WStwSein=mWebView.addJavascriptInterface(newbject({ulivoiclickOnAndroid({mHandler.post(newRunnble({ublivoirun(){}}},"demo");创建Android_25_03_WebViewFirst项1.准备web加载的资源文<!DOCTYPHTMLP<!DOCTYPHTMLPBLI'-/WCHTML40Transitional//EN'<ttle测试assets资产中的网页访问<mehttp-equiv="Content-Type"content="text/html;charset=utf-<script>alert('用户名不可以为空!');document.write('请输入用户注册信息 style='color:red;font-size:30px;border:soli blue;'>用户注册<ahref=""><im src='file:///android_asset/img021.jpg <frmethod='post'action=''用户名:<ptype='text'a密码:<nputype='password'putype='submit'value='注册2.xmversion="1.0"encoding="utf-coor=r3>3c<!--Baseapplicationtheme-- og<!--Cstoizyourthemhere--<tem><ac<RelativeLayoutxmlns:android="/apk/res/android"=vandroid:layout_height="match_parent"+=randroid:indeterminate="true"/>5.MainActivity代ubcasMubcasMainActivityextendsAppCompatActivityprvatWeVewiwprvtProgressBarpbprotectedvoionCreate(BundlesavedInstanceState{supe.nCeatesavedInstancette)cpb=(ProgressBar)findViewById(R.id.pb);eve=(WeViefindViewById(R.id.webview);//设置webview背景颜webview.setBackgroundColor(Color.rgb(255,255//设置字符webview.getSettings().setDefaultTextEncodingName("utf-//设置webview的一些缩放功能点 /johnny901114/article/details/786904//水平滚动条禁止//设置WebView可触摸放大缩小//设置其可以显示缩放按钮//WebView双击变大,可双击后变小,当手动放大后,双击可恢复到原始大小/*web.setInitialScale(25);//为25%,最小缩放等级解释: 里面的数字代表缩放等级)代表不缩什么是不缩放比如你要加载的网页中有图片的宽度是500px,如果你的手机分辨率(屏幕宽度是1000话那么整个图片只占一半的屏幕。其他的字体都是按照标准展示如果这个时候如果你设置web.setInitialScale(200),代表放大一倍,整个网页都会放大一这个时候图片正好展示整个屏幕宽度,另外网页的字体也会放大一倍倍如果这个时候如果你设置web.setInitialScale(50),代表缩小一倍,这个时候图片正好展另外网页的字体也会同时变小*e//允许JS执//webview有两个方法:setWebChromeClient和b//setWebChromeClient主要处理解析,渲染网页等浏览器做的事情//WebChromeClient是辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等webview.setWebChromeClient(newWebChromeClient()//处理Javascript中的Alert对话ubliboonJsAlert(WebViewvewtrurlStrnmessagefnaJsRsu{AlertDialog.Builderuilde=newAlertDialog.Builder(MainActivity.this);builder.setPositiveButton("确定",newDialogInterface.OnClickListener(){pubivoionClick(DialogInterfaceilogin{}builder.setNegativeButton("取消",newDialogInterface.OnClickListener()pubivoionClick(DialogInterfaceilogin{}return}//处理Javascript中的Confirm对话框ululiboeaonJsConfirm(WebViewewStnurlStngeJsesu{returnsuper.onJsConfirm(view,urlmessage}//页面加载好以后,在放开图片加载,刚开始加载网页时,不加载网页中的图片e//点击链接后不弹出浏览器窗口,而在WebView控件中加载webview.setWebViewClient(newWebViewClient()/* WebView中的shouldOverrideUrlLoading和onPageStarted这两个方法就是可以捕获到跳转的url,然后进行一系列的操作,但是他们两到底有什么区别呢?当点击页面中的链接的时候他们俩都会执行,但是返回到上一个页面的时候onPageStarted执行但是shouldOverrideUrlLoading就不执行了,就是onPageStarted什么时候都执行的,应用场景:有个需求WebView加载不同的url的时候应用的标题也是跟着改变的,这时候只要在onPageStarted中捕获url前缀进行判断就可以了,但是不能使用sia因为当从当前的页面返回到上个页面的时候这个方法并不执行,所以捕获就没有用了//控制新的连接在当前WebView中打开uliboeashouldOverrideUrlLoading(WebViewewStn{dreturn}//网页开始加载时调用这个方法ulivoionPageStarted(WebViewewStnulBtma{super.onPageStarted(view,ulc}//网页加载完毕调用这个方法ulivoionPageFinished(WebViewewStin{super.onPageFinished(view, 页面加载好以后,放开图片加载,刚开始加载网页时,不加载网页中的图片//pb进度条隐t}//密度不一样情况下,自动适配页面//像素密度:每单位像素多少。(像素/英寸//分辨率:显示器能够示显的像素多少。(水平×垂直如instDp=getResources().getDisplayMetrics().densityDpiif(densityDp==240){}esif(densityDp=={}{}Strcontent="<bodystyle='width:50%;'>""<script>//alert('不可以为空!');document.write('用户注册信息:');</script>+"<ahref=''target='_blank'><imgsrc='/img/bdlogo.gif'></a>""<br/>"+"<msrc='file:///android_asset/img021.jpg'width='50px'height='50px'>"+"<dstyle='color:red;font-size:30px;border:solid1pxblue;'>用户注册</dv>+"frmethod='post'action=''>"+"用户名:<inpu name=''><br> "密码nutype='password'name=''><br>"+ type='submit value='注册'> "/form>++loadData主要被设计用来装载URI格式的数据,它不能通过网络来加载内容loadData主要被设计用来装载URI格式的数据,它不能通过网络来加载内容 loadData不能加载图片内容,如果要加载图片内容或者获得更强大的Web支持请使用i loadData()中的htmdata中不能包含'#''''\','?'四中特殊字符,这就为我们内嵌css制造了些许麻烦,//因为css中经常用'#''%'等字符,需要如何处理呢?我们需要用UrlEncoder编码为%3%5//webview.loadData(content "text/html;charset=utf- //用法2加载数据,带基础路径7//loadDataWithBaseURL(StringaltrindatatinimTySinenoingtinhistoryUrl)//aseUr基础路径,这个基础路径如果与网页中包含这个路径的不一样,刚信息不能显示,你可把把其实这个基础路径是为了让其加载的网页中如果使用是的相对路径时引用的data要加载的内容ey要加载的内容类型//eoin内容编码 历史url可以为 "file:///android_asset/aboutus.html 三个///中的最后一/表示根路径开始//webview.loadDataWithBaseURL("",cott"utf-//用法3加载不受限制,什么都可以加载//用法}protectedvoionDestroy({sue.onDestoy()est}}<uses-permsso记得加上权限创建Android_25_04_WebView_JavaScript项<!DOCTYPEHTMLPULI"-//W/THTML40Transitional//EN"<tte模拟登录页面t http-equiv="content- content="text/html;charset=utf- <scrptype="text/javascript">functosubmitForm(){varlognInf=window.iGetInfo.getLoginInfos();if(loginInfo){document.getElementById("udocument.getElementById("username").valudocument.getElementById("pwd").valu =loginInfo.getUsername()loginInfo.getPassword()}}frmethod="post"ctin用户名:<inputtype="text"name="username"id="username"><br密码:<inputtype="text"name="pwd"id="pwd"><br<inputtype="button value="提交 <inputtype="reset"value="重置"2. version="1.0 encoding="utf-<or<orF<!--Baseapplicationtheme-- n<!--Cstoizyourthemhere--<ite<t<t5.MainActivity代ubcasMainActivityextendsAppCompatActivityteeVeteWebSettingswebSettings=Hanende=newprotected
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 延安大学西安创新学院《大学生心理健康》2021-2022学年第一学期期末试卷
- 延安大学《传热学》2022-2023学年第一学期期末试卷
- 学习策略与思维导图应用计划
- 三年级数学计算题专项练习及答案集锦
- 四年级数学(简便运算)计算题专项练习与答案
- 四年级数学(简便运算)计算题专项练习与答案
- 班级心得交流的有效性计划
- 仓库作业流程再造的尝试计划
- 班级趣味体育活动的设计与安排计划
- 项目质量管理计划
- 甘肃教育出版社小学六年级信息技术下册教案1
- 浙美版五年级知识点复习提纲(共12页)
- 农村信用社年度信贷投向指引
- 浅谈电梯安装过程中的常见问题及对策
- 2022年营配贯通项目背景,相关系统及工作内容介绍
- 机械制造与自动化在电梯制造中的应用
- 晶体中的非线性光学效应
- 中亚五国纺织工业发展状况
- 玻璃布施工工艺
- 工程公司薪酬体系方案
- 员工奖惩制度 公司员工奖惩制度范本
评论
0/150
提交评论