![2015android基礎(chǔ)入門教程版打包合集-android7.3.3文件_第1頁(yè)](http://file4.renrendoc.com/view/705d807396547733a732a4dad34b9fa5/705d807396547733a732a4dad34b9fa51.gif)
![2015android基礎(chǔ)入門教程版打包合集-android7.3.3文件_第2頁(yè)](http://file4.renrendoc.com/view/705d807396547733a732a4dad34b9fa5/705d807396547733a732a4dad34b9fa52.gif)
![2015android基礎(chǔ)入門教程版打包合集-android7.3.3文件_第3頁(yè)](http://file4.renrendoc.com/view/705d807396547733a732a4dad34b9fa5/705d807396547733a732a4dad34b9fa53.gif)
![2015android基礎(chǔ)入門教程版打包合集-android7.3.3文件_第4頁(yè)](http://file4.renrendoc.com/view/705d807396547733a732a4dad34b9fa5/705d807396547733a732a4dad34b9fa54.gif)
![2015android基礎(chǔ)入門教程版打包合集-android7.3.3文件_第5頁(yè)](http://file4.renrendoc.com/view/705d807396547733a732a4dad34b9fa5/705d807396547733a732a4dad34b9fa55.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
title:Android基礎(chǔ)入門——7.3.3Android文件]categories:]Android基礎(chǔ)入門——7.3.3Android文件下本節(jié)引 好的,開(kāi)始本節(jié)內(nèi)容!聽(tīng)上去蠻進(jìn)度,在繼的進(jìn)度!每次啟動(dòng)時(shí)根據(jù)線程id查詢某線程單的Android多線程斷點(diǎn)的代碼流程解析運(yùn)行效果圖實(shí)現(xiàn)流程全解析創(chuàng)建數(shù)據(jù)庫(kù)表,于是乎創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)的管理器類,繼承OpenHelper類 packageimportimport import Database.Cursorimportandroid.database. publicclassDBOpenHelper OpenHelperpublicDBOpenHelper(Contextcontext)super(context,"downs.db",null, publicvoid Databasedb)//數(shù)據(jù)庫(kù)的結(jié)構(gòu)為:表名:filedownlog字段:id,downpath:當(dāng) 的資源 的最后位db.execSQL("CREATE NOTEXSTSfiledownlog"(idintegerprimarykey"downpathvarchar("threadidNTEGER,downlength publicvoidonUpgrade( Databasedb,intoldVersion,intnewVersion){ db.execSQL("DROP EXSTS 線 ③ 的線程新開(kāi)辟后① packagecom.jay.example.db;importimportimportimportimportandroid.database. *該類是一個(gè)業(yè)務(wù)bean類,.*publicclassileServiceprivateDBOpenHelperpublicileService(Contextcontext)openHelper=new}2*獲得指定UR的每條線程已經(jīng)的文件長(zhǎng)*@param**publicMap<nteger,nteger>getData(String{ 實(shí)現(xiàn)返回的其實(shí)都是可寫的數(shù)據(jù)庫(kù)句Databasedb= 的路徑查詢所有現(xiàn)場(chǎng) Cursorcursor=db.rawQuery("selectthreadid,downlengthfromfiledownlogwheredownpath=?",new 的文件長(zhǎng)Map<nteger,nteger>data=newHashMap<nteger,cursor.moveTo{ (0), ( etColumnndexOrThrow("thread etColumn return *保存每條線程已經(jīng)的文件長(zhǎng)*@parampath的路*@parammap現(xiàn)在的di和已經(jīng)的長(zhǎng)度的集publicvoidsave(Stringpath,Map<nteger,nteger>{Databasedb=//開(kāi)啟事務(wù),因?yàn)榇颂幮枰鄺l數(shù) ntry<nteger,nteger>entry: {//特定路徑特定線 D已經(jīng)的數(shù) db.execSQL("insertintofiledownlog(downpath,threadid,downlength)values(?,?,?)",newObject[]{path,entry.getKey(),}//設(shè)置一個(gè)事務(wù)成功的標(biāo)志,如果成功就提交事務(wù),如果沒(méi)調(diào)用該方法的話那么務(wù)回7}}*實(shí)時(shí)更新每條線程已經(jīng)的文件長(zhǎng)*@param8*@param}9publicpublicvoidupdate(Stringpath,intthreadd,int{Databasedb=db.execSQL("updatefiledownlogsetdownlength=?wheredownpath=?andthreadid=?",newObject[]{pos,path,thread0*@parampublicvoiddelete(String{Databasedb=openHelper.getWritableDatabase();db.execSQL("deletefromfiledownlogwheredownpath=?",newObje}}長(zhǎng)長(zhǎng)度的方法,這里需要添加一個(gè)synchronized關(guān)鍵字,用來(lái)解決并發(fā)⑤累計(jì)當(dāng)前②③定義一個(gè)退 的方法④是線程池threads和同步集合ConcurrentHashMap,用于緩存線①定義一堆變量長(zhǎng)度 ...packageimportjava.io.importjava.io.RandomAccessile;import.URL;importjava.util.Map;importjava.util.UUimportjava.util.regex.Matcher;importprivatestaticfinalStringTAG="privatestaticfinalintRESPONSEOK=類";//設(shè)置一個(gè)查log2com.jay.example.db.class{ privateileServicefileService; privateboolean //停止的標(biāo)Contextint=//已的文件長(zhǎng)3intfileSize=privateDownloadThread[] //根據(jù)線程數(shù)設(shè)置的線程privateilesave privateMap<nteger,nteger>data=newConcurrentHashMap<nteger>();//緩存?zhèn)€條線程的的長(zhǎng)privateint //每條線程的長(zhǎng)privateString //的路*4publicint{//returnreturn}**5publicvoid{this.exited= }publicboolean{return}6**publicintget{return}*累計(jì)已的大 *使用同步鎖來(lái)解決并發(fā)的問(wèn) *protectedsynchronizedvoidappend(int{//把實(shí)時(shí)的長(zhǎng)度加入到總的長(zhǎng)度downloadedSize= *更新指定線程最后的位*@paramthreadd線程 *@parampos最后的位*protectedsynchronizedvoidupdate(intthreadd,int{//把指定線程id的線程賦予的長(zhǎng)度,以前的值會(huì)被覆蓋this.data.put(threadd,//更新數(shù)據(jù)庫(kù)中制定線程的長(zhǎng)this.fileService.update(this.downloadUrl,threadd, .*構(gòu)建文件*@paramdownloadUrl路*@paramfileSaveDir*@paramthreadNum線程* publicileDownloadered(Contextcontext,StringdownloadUrl,ilefileSaveDir,intthreadNum) 0 trythis.context= this.downloadUrl=downloadUrl;//為路徑賦 fileService=newileService(this.context); URLurl=newURL(this.downloadUrl); if(!fileSaveDir.exists())fileSaveDir.mkdir();//如果文件不 this.threads=newDownloadThread[threadNum]; HttpURLConnectionconn(HttpURLConnectionurl.openConnec //創(chuàng)建連接句柄,這里并未真正連接 //設(shè)置連接超件為5 //設(shè)置用戶端可以接收的類 conn.setRequestProperty("Accept","image/gif,image/jpeg,image/pjpeg," "image/pjpeg,application/xshockwaveflash,application/xamlxml," "application/vnd.msxps ,application/xmsx "application/xmsapplication,application/vnd.ms "application/vnd.ms,application/msword,*/*"); conn.setRequestProperty("AcceptLanguage"zhCN");//設(shè) conn.setRequestProperty("Referer",downloadUrl); conn.setRequestProperty("Charset","UT8"); conn.setRequestProperty("UserAgent","Mozilla/4.0(compatible;MSE8.0;" "WindowsNT5.2;Trident/4.0;.NETCLR..4322;.NETCLR2.0.50727;"".NETCLR3.0.04506.30;.NETCLR3.0.4506.252;ETCLR conn.setRequestProperty("Connection""KeepAlive");//設(shè)置 //和資源建立正在的,但尚無(wú)返回的數(shù)據(jù) if(conn.getResponseCode()=={ this.fileSizeconn.getContentLength();//根據(jù)響應(yīng)獲得 if(this.fileSize0)thrownewRuntimeException("不知道文件大小");//文件長(zhǎng)度小于等于0時(shí)拋出運(yùn)行時(shí)異常Stringfilename=get ee=w;/根據(jù)存 件Map<nteger,nteger>logdata= //獲取記//如果存在記if(logdata.size()> //遍歷集合中的數(shù)據(jù),把每條線程已的數(shù)據(jù)長(zhǎng)度放入data for(Mntry<nteger,nteger>entry: data.put(entry.getKey(), if(this.data.size()== //遍歷每條線程已的數(shù) for(inti=0;i<this.threads.length;i this.downloadedSize=this.data.get(i print("已的長(zhǎng)度 //使用條件運(yùn)算符求出每個(gè)線程需要的數(shù)據(jù)長(zhǎng)?
this.block=(this.fileSize%this.threads.length)== this.fileSize/ this.fileSize/ thrownewRuntimeException("服務(wù)器反饋出錯(cuò)}}catch(Exception{7 thrownewRuntimeException("無(wú)法連接}}**privateStringgetileName(HttpURLConnection8 //從的路徑的字符串中獲取文件的名 Stringfilename=this.downloadUrl.substring(this.downloadUrl.lastndexOf('/') if(filename==null for(inti0;;i)//{ Stringmine=conn.getHeaderield(i); if(mine==null)break; //獲取contentdisposition返回字段, if("contentdisposition".equals(conn.getHeaderieldKey(i).t9 Matchermpile(".*filename=(.*)").matcher( if(m.find())returnm.group(); filenameUUD.randomUUD()".tmp";//如果都沒(méi)找到的話,默認(rèn)取一個(gè)6}return 20*開(kāi)始文 *@paramlistener數(shù)量的變化,如果不需要了解實(shí)時(shí)的數(shù)量,可以設(shè)置*@return已文件大*@throws//進(jìn)行,如果有異常的話,拋出異常給調(diào)用 publicintdownload(Downlo rogressListenerlistener)throwsExcep2 try2. RandomAccessilerandOut=newRandomAccessile(this.saveile,"rwd");2 2 if(this.fileSize>0)2 2 URLurl=new2 if(this.data.size()!=2 //如果原先未曾或者原先的線程數(shù)與現(xiàn)在的線程數(shù)不一2 2 for(inti=0;i<this.threads.length;i) this.data.put(i,0);//初始化每條線程已經(jīng)的數(shù)據(jù)長(zhǎng)度}=//設(shè)置已經(jīng)的長(zhǎng)度為}(inti0ithis.threads.lengthi intdownLength=this.data.get(i //通過(guò)特定的線程id獲取該線程已經(jīng)的數(shù)據(jù)長(zhǎng) //判斷線程是否已經(jīng)完成,否則繼續(xù) if(downLength<this.block&&this.downloadedSize<this. this.threads[i]=newDownloadThread(this,url,this.saveile,this.block,this.data.get(i),i); //設(shè)置線程優(yōu)先級(jí),Thread.NORM_PRORTY= //Thread.MN_PRORTY=;Thread.MAX_PRORTY= this.threads[i] }}24//如果存在記錄,刪除它們,然后重新添fileService.save(this.downloadUrl,//把的實(shí)時(shí)數(shù)據(jù)寫入數(shù)據(jù)庫(kù)booleannotinish=//未完while(notinish)//25notinish= //假定全部線程完 for(inti=0;i<this.threads.length;i if(this.threads[i]!=null!this.threads[i].isinish()) notinish= //設(shè)置標(biāo)志為沒(méi)有完 if(this.threads[i].getDownLength() //如果失敗,再重新在已的數(shù)據(jù)長(zhǎng)度的基礎(chǔ) //重新開(kāi)辟線程,設(shè)置線程的優(yōu)先 this.threads[i]=newDownloadThread(this,url,this.saveile,this.block,this.data.get(i),i); //通知目前已經(jīng)完成的數(shù)據(jù)長(zhǎng) if(downloadedSize==this.fileSize) //完成刪除記 }catch(Exceptione)thrownewException("文件異常}return}28**@param* publicstaticMap<String,String>getHttpResponseHeader(HttpURLConnectionhttp){Map<String,String>header=newLinkedHashMap<String,for(inti=0;;i)Stringmine=http.getHeaderield(i);//獲取第i}return}*打印Http*@param29if(mine29if(mine==null)header.put(http.getHeaderieldKey(i),mine);//獲得第i30publicstaticvoidprintResponseHeader(HttpURLConnectionMap<String,String>header=ntry<String,String>entry:Stringkey=entry.getKey()!=null?entry.getKey()":""3print(key}}33333333@parammsgprivatestaticvoidprint(String{Log.i(TAG,}}Run()①首先肯定是要繼承Thread類啦,然后重寫Run() packagecom.jay.example.service;importjava.io.importjava.io.importjava.io.RandomAccessimportimportimport publicclassDownloadThreadextendsThreadprivatestaticfinalStringTAG= 線程類 privateilesaveile; privateURL 的privateint 的大privateintthreadd privateintdownLength; privatebooleanfinish=false; privateileDownloadered 2. publicDownloadThread(ileDownloadereddownloader,URLdownUrl,ilesaveile,intblock,intdownLength,intthreadd){this.downUrl=this.saveile=savethis.block=this.downloader=this.threadd=threadthis.downLength= 3 publicvoidrun()if(downLength<block){// 完try HttpURLConnectionhttp=(HttpURLConnection)downUrl.ophttp.setConnectTimeout(5* http.setRequestProperty("Accept","image/gif,image/jpeg,image/pjpeg,image/pjpeg,application/xshockwaveflash,application/xamlxml,application/vnd.msxps ,application/xmsxbap,application/xmsapplication,application/vnd.msexcel,application/vnd.ms,application/msword,*/*");http.setRequestProperty("AcceptLanguage","zhhttp.setRequestProperty("Referer",http.setRequestProperty("Charset","UT4. intstartPos=block*(threadd intendPos=block*thread http.setRequestProperty("Range","bytes=" ""endPos);//設(shè)置獲取實(shí)體數(shù)據(jù)的范圍 http.setRequestProperty("UserAgent","Mozilla/4.0(compatible;MSE8.0;WindowsNT5.2;Trident/4.0;.NETCLR..4322;.NETCLR2.0.50727;.NETCLR3.0.04506.30;.NETCLR3.0.4506.252;.NETCLR http.setRequestProperty("Connection","KeepAlive"); nputStreaminStream=http.getnputStream(); byte[]buffer=newbyte[024]; 本地?cái)?shù)據(jù)的緩存大小為MB intoffset=0; print("Thread" this.threadd startdownloadfromposition"startPos);//打印該線程開(kāi)始的位置5RandomAccessilethreadfile=newRandomAccess.saveile, //用戶沒(méi)有要求停止,同時(shí)沒(méi)有達(dá)到請(qǐng)求數(shù)據(jù)的末尾時(shí)會(huì)一直循環(huán) while(!downloader.getExited()&&(offset=inStream.read(buffer,0,024))!= ){ threadfile.write(buffer,0,offset); downLength=offset; downloader.update(this.threadd,downLength);//線程已 的數(shù)據(jù)長(zhǎng)度更新到數(shù)據(jù)庫(kù)和內(nèi)存哈希表 }6print("Thread this.thread"this.finish= 完成還是用戶主動(dòng)中}catch(Exceptione)this.downLength 該線程已 的長(zhǎng)度print("Threadd}}}7privatestaticvoidprint(StringLog.i(TAG,} *publicbooleanisinish()return}8*已 的內(nèi)容大*@return如果返回值 失publiclonggetDownLength()return}}Step5:創(chuàng)建一個(gè) FileDownloader中使用了 rogressListener進(jìn)行進(jìn)度所以這里需要?jiǎng)?chuàng)建一個(gè)接口,同時(shí)定義一個(gè)方法的空實(shí)現(xiàn) ..packagepublicinterfacerogressListenerpublicvoidonDownloadSize(int}另外調(diào)用android:enabled="false"設(shè)置組件是否可點(diǎn)擊,代碼如下 android:id="@id/LinearLayout> 的文件地址"android:id="@android:text="http://0. 2 android:id="@ android:id="@3 android:layout_height="android:id="@ 4 android:id="@ 的百分比..packageimportjava.io.importcom.jay.example.service.import.2classMainActivityextendsActivityprivateEditTextprivateButtonprivateButtonprivateTextViewprivateProgressBar privatestaticfinalintPROCESSNG=; privatestaticfinalintALURE //失敗時(shí)的Message標(biāo)3 privateHandlerhandler=newUHander();privatefinalclassUHanderextendspublicvoidhandleMessage(Messagemsg)switch(msg.what)//casePROCESS intsize=msg.getData().ge //計(jì)算已經(jīng)的百分比,此處需要轉(zhuǎn)換為浮點(diǎn)數(shù)計(jì) floatnum=(float)progressbar.getProgress()/(float)p intresult=(int)(num*00); textresult.setText(result"%"); if(progressbar.getProgress()==//完成時(shí)提 Toast.makeText(getApplicationContext(),"文件成", caseA //失敗時(shí)提 Toast.makeText(getApplicationContext(),"文件失敗 protectedvoidonCreate(BundlesavednstanceState)super.onCreate(savededitpath=(EditText)findViewBybtndown=(Button)findViewBybtnstop=(Button)findViewBytextresult=(TextView)findViewByprogressbar=(ProgressBar)findViewByButtonClickListenerlistener=new privatefinalclassButtonClickListenerimplementsView.OnClickListpublicvoidonCli
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 生態(tài)科普活動(dòng)對(duì)公眾參與環(huán)境保護(hù)的推動(dòng)作用
- 現(xiàn)代建筑設(shè)計(jì)在保障路橋安全運(yùn)營(yíng)中的作用研究
- 電子商務(wù)平臺(tái)的發(fā)展趨勢(shì)及對(duì)未來(lái)商業(yè)生態(tài)的影響
- 電商物流配送的自動(dòng)化與智能化趨勢(shì)
- 電商平臺(tái)營(yíng)銷戰(zhàn)略全解析
- 電信行業(yè)售后服務(wù)流程優(yōu)化
- 現(xiàn)代醫(yī)療健康產(chǎn)業(yè)的創(chuàng)新型廣告模式
- 現(xiàn)代教育心理學(xué)智慧課堂的關(guān)鍵要素
- 銅陵安徽銅陵市銅官區(qū)小學(xué)非編音樂(lè)教師招聘筆試歷年參考題庫(kù)附帶答案詳解
- 現(xiàn)代倉(cāng)儲(chǔ)技術(shù)的國(guó)際比較與發(fā)展趨勢(shì)
- (正式版)HGT 6313-2024 化工園區(qū)智慧化評(píng)價(jià)導(dǎo)則
- 單店爆破促銷活動(dòng)模式精編文檔
- YS/T 34.1-2011高純砷化學(xué)分析方法電感耦合等離子體質(zhì)譜法(ICP-MS)測(cè)定高純砷中雜質(zhì)含量
- LY/T 2016-2012陸生野生動(dòng)物廊道設(shè)計(jì)技術(shù)規(guī)程
- 松下panasonic-視覺(jué)說(shuō)明書pv200培訓(xùn)
- 單縣煙草專賣局QC課題多維度降低行政處罰文書出錯(cuò)率
- 毫針刺法(全)教學(xué)課件
- 金風(fēng)科技-風(fēng)電產(chǎn)業(yè)集團(tuán)-供應(yīng)商現(xiàn)場(chǎng)作業(yè)基礎(chǔ)安全考試附答案
- 公共關(guān)系學(xué)完整教學(xué)課件
- 人工智能機(jī)器人科學(xué)小報(bào)手抄報(bào)簡(jiǎn)報(bào)
- 三年級(jí)下冊(cè)美術(shù)課件-第1課 燈彩輝映|浙美版 (共19張PPT)
評(píng)論
0/150
提交評(píng)論