詳解文稿android講課天_第1頁
詳解文稿android講課天_第2頁
詳解文稿android講課天_第3頁
詳解文稿android講課天_第4頁
詳解文稿android講課天_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

Android講課第25一、什么是LruCache?LruCacheLru的全稱是LeastAndroid講課第25一、什么是LruCache?LruCacheLru的全稱是LeastRecentlyUsed LruCache的實現(xiàn)原理:把近期最少使用的數(shù)據(jù)從緩存中移除,保留使用最頻繁的數(shù)據(jù)。講到uCach不得不提一下nkahMa,因為uCach中u算法的實現(xiàn)就是通過nkahMa來實現(xiàn)的。nkahMa繼承于ahMa,它使用了一個雙向鏈表來存儲Ma中的En順序關(guān)系,這種順序有兩種:這可以由其構(gòu)造函數(shù)ucnkahMantntaCaact,fataFact,anacc指定。所以,對于t、ut、me等操作,nkahMap除了要做ahMap做的事情,還做些調(diào)整Ent順序鏈表的工作。uCach中將nkahMa的順序設(shè)置為U順序來實現(xiàn)U緩存,每次調(diào)用t片,則將該對象移到鏈表的尾端。調(diào)用u將鏈表頭部的對象(近期最少用到的)/liuling/archive/2015/09/24/2015-9-24-總1、LruCacheLru創(chuàng)建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()//得到內(nèi)存lonmaxMemory=//newLruCache<String,//緩存不同的數(shù)據(jù),//newLruCache<String,//緩存不同的數(shù)據(jù),需要重寫sizeOf方法。比如,上面緩存的是//。本質(zhì)上,這些數(shù)據(jù)都是存儲在內(nèi)存中的,因此,cacheSize不宜過大uCah=newLruCache<String,(int)maxMemory/8)he以鍵值對的形式,初始化時,需要設(shè)置緩存的大小K,超過這個大小的數(shù)據(jù)將會被清除。注意:清除的數(shù)據(jù),是那些被先加入的數(shù)據(jù)。ce內(nèi)部的數(shù)據(jù)結(jié)構(gòu)是nda存儲的。這樣,ce就達到了緩存最近p的個數(shù)據(jù)protectedinsizeOf(Stringkey,Bitmapvalue)//value.getRowBytes()用于計算位圖每一行所占用的內(nèi)存字節(jié) 得到高indata=value.getRowBytes()*return}}rvatvoiinitView()im=(ImageView)eimg thisic_launcherpd.setTitle("提示pd.setMessage("數(shù)據(jù)加載 }pubivoiclickButton(View{if(v.getId()==R.id.btn)//清空ifimg.getDrawable()==null{imnull}Bitmapbitmap=l//從緩存中尋找圖bitmap=urlPaththis (bitmap!={img}els//緩存中沒//下面從網(wǎng)絡(luò)中進行加//顯示加載對話ifpd{pd}//網(wǎng)絡(luò)加載,這是一個耗時任務(wù),開啟一個線程來完newThread(new{ublioirun()byte[]data=.demurlPath//這個bm是從網(wǎng)絡(luò)中加載出一來的原fnaBitmapbm=BitmapFactory.decodeByteArray(data,,data.length);TAG,">bm:+bm.getByteCount());if(bm!=null)//將原圖放到sd卡beaflag=urlPathurlPath.lastIndexOf("/")+1),etif(flag)//保存成功,創(chuàng)建縮略圖并放到緩存lruCacheStringfilePaht=mContextBitmapbm_thumbnail=50,TAG,">bm_thumbnai:+if(bm_thumbnail!=nullluCachurlPath,TAG,">網(wǎng)絡(luò)加載的圖片被保存進LCh"}}elsTAG,">網(wǎng)絡(luò)加載的圖片被保存進SD卡失?。?}}handlernew{ublioirun()TAG,">將網(wǎng)絡(luò)ublioirun()TAG,">將網(wǎng)絡(luò)加載的圖片顯示出來");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,,//對圖片進行二次采樣,生成縮略圖,防止加載過大圖片出現(xiàn)內(nèi)存溢Bitmapbm_thumbnail=BitmapThumbnailHelper.createThumbnail(data,,0);TAG,">bm_thumbnail2:"+bm_thumbnail.getByteCount());TA,">bm:+bm.getByteCount()); (bm!={luCachebm_thumbnail);TAG,">SD卡找到圖片");return}}}}returnl}應(yīng)用程序在運行的過程中如果需要向手機上保存數(shù)據(jù),一般是把數(shù)據(jù)保存在SDcrd中的。大部分應(yīng)用是直接在SDCd的根目錄下創(chuàng)建一個文件夾,然后把數(shù)據(jù)保存在該文件夾中。這樣當(dāng)該應(yīng)用被卸載后,這些數(shù)據(jù)還保留在SDCd中,留下了垃圾數(shù)據(jù)。如果你想讓你的應(yīng)用被卸載后,與該應(yīng)用相關(guān)的數(shù)據(jù)也清除掉,該怎么辦通過Context.getExternalFilesDir()方法可以獲取到SDCard/Android/data/你的應(yīng)用的包名/files/目錄,一通過Context.getExternalCacheDir()方法可以獲取到SDCard/Android/data/你的應(yīng)用包名/cache/目錄,一般如果使用上面的方法,當(dāng)你的應(yīng)用在被用戶卸載后,SDCard/Android/data/你的應(yīng)用的包名/這個目錄下的所不會留下垃圾信息。而且上面二個目錄分別對設(shè)置->應(yīng)用->應(yīng)用詳情里面的”清除數(shù)據(jù)“與”清除緩存“項pivatStringgetFileCachePath(Contextcontext)StringfileName=uPaturlPathreturncontext.getExternalCacheDir().getAbsolutePath()+}}5SDCardHelper.java//sd卡操作工具HttpURLConnHelper.java//網(wǎng)絡(luò)加載工具BitmapThumbnailHelper.java//縮圖工6<uses-permi6<uses-permissionandroid:name="android.permission.INTERNETpermissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGEpermissionandroid:name="android.permission.READ_EXTERNAL_STORAGE二、大位圖二次采樣壓縮處理 OutofMemory內(nèi)存不足/在中顯示圖片一般使用,通過、等方法指定要顯示的對象,而這些方法最終都會調(diào)用到ee方法來生成一個進行顯示。對于一般的小圖片這樣使用沒有什么問題,因為垃圾回收器會及時將不用的圖片進行回收,但連續(xù)加載大圖片的時候就會發(fā)生典型的問題,也就是內(nèi)存溢出,這是因為在致程序崩潰。因此要避免OOM的問題就需要對大圖片的加載進行管理,主要通過縮放來減小圖片的內(nèi)存占用Bitmap的縮生成Bitmap都要通過BitmapFactory的decode()方法,使用此方法時可以傳入一個解析參數(shù)BitmapFactory.Option來對控制解析過程,比如獲得長寬、改變采樣率、改變采樣格式等。而對Bitmap的縮放就是通過改變采樣率來實創(chuàng)建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()//開一個線程加載網(wǎng)絡(luò)圖片newea(e{ublivoirun()//從網(wǎng)絡(luò)上加載原圖byte[]data=//生成原originalBitma//生成縮略=BitmapFactory.decodeByteArray(data,0)=Bitmap.Config.ALPHA_8指明色彩的存儲方法createThumbnailBitmap(data,050thumbnailBitma//處理完成,下面通知handler進行圖片顯}}*縮略圖生成方法**param生成縮略圖的數(shù)據(jù)*param 縮略圖的最大高param 縮略圖的最大寬*param縮略圖的色彩方** 返回一個生成的縮略圖pivatBitmcreateThumbnailBitmap(byte[]dtainmaxHhtinmaxWthBitmap.Configconf{//生成采集時的參數(shù)選項對象BitmapFactory.Optionspton=new//設(shè)置第一次采樣時候只采集邊界options.inJustDecodeBounds=//執(zhí)行第一次采樣//設(shè)置inJustDecodeBounds為true后,并不分配空間,但可計算出原始圖片的長度和寬度BitmapFactory.decodeByteArray(data,0data.length,options);//options是采樣時的采樣參數(shù)對//獲取原圖的寬度和高度 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 }:}//設(shè)置圖片色彩質(zhì)量options.inPreferredConfig=//執(zhí)行第二次彩樣,這次不僅僅是采集邊界,而是全部采樣噢options.inJustDecodeBounds=//按options要求進行一次采集圖像后返回Bitmap對returnBitmapFactory.decodeByteArray(data,0data.length,}**@papahNameaamxHeh@aamaxWit@aaofi****prvttmcreateThumbnail(StringpNmeinxetinxWthBitmap.Configcofg{BitmapFactory.Optionspton=new 設(shè)置第一次采樣的時候只采集邊界數(shù)據(jù)options.inJustDecodeBounds=//執(zhí)行第一次采樣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?:}}}//設(shè)置圖片的質(zhì)量options.inPreferredConfig=//執(zhí)行第2次采樣options.inJustDecodeBounds=returnBitmapFactory.decodeFile(pathName,}}4HttpURLConnHelper工具類同上一個案<uses-m <uses-m android:name="android.permission.INTERNET三在Android手機中內(nèi)置了一款高性能webkit內(nèi)核瀏覽器,在SDK中封裝為一個叫做WebView組件什么是ebi是一個開源項目,主要由KDE的KHTML修改而來并且包含了一些來自蘋果公司的一些組件傳統(tǒng)上,WebKit包含一個網(wǎng)頁引擎WebCore和一個腳本引擎JavaScriptCore,它們分別對應(yīng)的是KDE的KHTML和KJS.不過,隨著JavaScript引擎的獨立性越來越強,現(xiàn)在WebKit和WebCore已經(jīng)基本上混用不分(例如GoogleChrome和Maxthon3采用V8引擎,卻仍然宣稱自己是WebKit內(nèi)核).AndroidManifest.xml中必須使用許可"android.permission.INTERNET",否則會出Webpagenotavailable錯誤如果訪問的頁面中有Javascript,則WebView必須設(shè)置支持E如果頁面中鏈接,如果希望點擊鏈接繼續(xù)在當(dāng)前browser中響應(yīng),而不是新開Android的系統(tǒng)browser中響應(yīng)該鏈接,必須覆蓋WebView的WebViewClient對象.returntrue;}網(wǎng)頁回退而不ActivityBack事件.publicbooleanonKeyDown(intkeyCode,KeyEventevent)if((keyCode==KeyEvent.KEYCODE_BACK)&&returntrue;}returnsuper.onKeyDown(keyCode,}android中bV是如何支持javascripte自定義對象的,在w3c標準中js有wn,history,等標準對象,同樣我們可以在開發(fā)瀏覽器時自己定義我們的對象調(diào)用手機系統(tǒng)功能來處理,這樣使欲為了WStwSein=mWebView.addJavascriptInterface(newbject({ulivoiclickOnAndroid({mHandler.post(newRunnble({ublivoirun(){}}},"demo");創(chuàng)建Android_25_03_WebViewFirst項1.準備web加載的資源文<!DOCTYPHTMLP<!DOCTYPHTMLPBLI'-/WCHTML40Transitional//EN'<ttle測試assets資產(chǎn)中的網(wǎng)頁訪問<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);//設(shè)置webview背景顏webview.setBackgroundColor(Color.rgb(255,255//設(shè)置字符webview.getSettings().setDefaultTextEncodingName("utf-//設(shè)置webview的一些縮放功能點 /johnny901114/article/details/786904//水平滾動條禁止//設(shè)置WebView可觸摸放大縮小//設(shè)置其可以顯示縮放按鈕//WebView雙擊變大,可雙擊后變小,當(dāng)手動放大后,雙擊可恢復(fù)到原始大小/*web.setInitialScale(25);//為25%,最小縮放等級解釋: 里面的數(shù)字代表縮放等級)代表不縮什么是不縮放比如你要加載的網(wǎng)頁中有圖片的寬度是500px,如果你的手機分辨率(屏幕寬度是1000話那么整個圖片只占一半的屏幕。其他的字體都是按照標準展示如果這個時候如果你設(shè)置web.setInitialScale(200),代表放大一倍,整個網(wǎng)頁都會放大一這個時候圖片正好展示整個屏幕寬度,另外網(wǎng)頁的字體也會放大一倍倍如果這個時候如果你設(shè)置web.setInitialScale(50),代表縮小一倍,這個時候圖片正好展另外網(wǎng)頁的字體也會同時變小*e//允許JS執(zhí)//webview有兩個方法:setWebChromeClient和b//setWebChromeClient主要處理解析,渲染網(wǎng)頁等瀏覽器做的事情//WebChromeClient是輔助WebView處理Javascript的對話框,網(wǎng)站圖標,網(wǎng)站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}//頁面加載好以后,在放開圖片加載,剛開始加載網(wǎng)頁時,不加載網(wǎng)頁中的圖片e//點擊鏈接后不彈出瀏覽器窗口,而在WebView控件中加載webview.setWebViewClient(newWebViewClient()/* WebView中的shouldOverrideUrlLoading和onPageStarted這兩個方法就是可以捕獲到跳轉(zhuǎn)的url,然后進行一系列的操作,但是他們兩到底有什么區(qū)別呢?當(dāng)點擊頁面中的鏈接的時候他們倆都會執(zhí)行,但是返回到上一個頁面的時候onPageStarted執(zhí)行但是shouldOverrideUrlLoading就不執(zhí)行了,就是onPageStarted什么時候都執(zhí)行的,應(yīng)用場景:有個需求WebView加載不同的url的時候應(yīng)用的標題也是跟著改變的,這時候只要在onPageStarted中捕獲url前綴進行判斷就可以了,但是不能使用sia因為當(dāng)從當(dāng)前的頁面返回到上個頁面的時候這個方法并不執(zhí)行,所以捕獲就沒有用了//控制新的連接在當(dāng)前WebView中打開uliboeashouldOverrideUrlLoading(WebViewewStn{dreturn}//網(wǎng)頁開始加載時調(diào)用這個方法ulivoionPageStarted(WebViewewStnulBtma{super.onPageStarted(view,ulc}//網(wǎng)頁加載完畢調(diào)用這個方法ulivoionPageFinished(WebViewewStin{super.onPageFinished(view, 頁面加載好以后,放開圖片加載,剛開始加載網(wǎng)頁時,不加載網(wǎng)頁中的圖片//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主要被設(shè)計用來裝載URI格式的數(shù)據(jù),它不能通過網(wǎng)絡(luò)來加載內(nèi)容loadData主要被設(shè)計用來裝載URI格式的數(shù)據(jù),它不能通過網(wǎng)絡(luò)來加載內(nèi)容 loadData不能加載圖片內(nèi)容,如果要加載圖片內(nèi)容或者獲得更強大的Web支持請使用i loadData()中的htmdata中不能包含'#''''\','?'四中特殊字符,這就為我們內(nèi)嵌css制造了些許麻煩,//因為css中經(jīng)常用'#''%'等字符,需要如何處理呢?我們需要用UrlEncoder編碼為%3%5//webview.loadData(content "text/html;charset=utf- //用法2加載數(shù)據(jù),帶基礎(chǔ)路徑7//loadDataWithBaseURL(StringaltrindatatinimTySinenoingtinhistoryUrl)//aseUr基礎(chǔ)路徑,這個基礎(chǔ)路徑如果與網(wǎng)頁中包含這個路徑的不一樣,剛信息不能顯示,你可把把其實這個基礎(chǔ)路徑是為了讓其加載的網(wǎng)頁中如果使用是的相對路徑時引用的data要加載的內(nèi)容ey要加載的內(nèi)容類型//eoin內(nèi)容編碼 歷史url可以為 "file:///android_asset/aboutus.html 三個///中的最后一/表示根路徑開始//webview.loadDataWithBaseURL("",cott"utf-//用法3加載不受限制,什么都可以加載//用法}protectedvoionDestroy({sue.onDestoy()est}}<uses-permsso記得加上權(quán)限創(chuàng)建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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論