2015android基础入门教程版打包合集-android7.3.3文件_第1页
2015android基础入门教程版打包合集-android7.3.3文件_第2页
2015android基础入门教程版打包合集-android7.3.3文件_第3页
2015android基础入门教程版打包合集-android7.3.3文件_第4页
2015android基础入门教程版打包合集-android7.3.3文件_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

title:Android基础入门——7.3.3Android文件]categories:]Android基础入门——7.3.3Android文件下本节引 好的,开始本节内容!听上去蛮进度,在继的进度!每次启动时根据线程id查询某线程单的Android多线程断点的代码流程解析运行效果图实现流程全解析创建数据库表,于是乎创建一个数据库的管理器类,继承OpenHelper类 packageimportimport import Database.Cursorimportandroid.database. publicclassDBOpenHelper OpenHelperpublicDBOpenHelper(Contextcontext)super(context,"downs.db",null, publicvoid Databasedb)//数据库的结构为:表名:filedownlog字段:id,downpath:当 的资源 的最后位db.execSQL("CREATE NOTEXSTSfiledownlog"(idintegerprimarykey"downpathvarchar("threadidNTEGER,downlength publicvoidonUpgrade( Databasedb,intoldVersion,intnewVersion){ db.execSQL("DROP EXSTS 线 ③ 的线程新开辟后① packagecom.jay.example.db;importimportimportimportimportandroid.database. *该类是一个业务bean类,.*publicclassileServiceprivateDBOpenHelperpublicileService(Contextcontext)openHelper=new}2*获得指定UR的每条线程已经的文件长*@param**publicMap<nteger,nteger>getData(String{ 实现返回的其实都是可写的数据库句Databasedb= 的路径查询所有现场 Cursorcursor=db.rawQuery("selectthreadid,downlengthfromfiledownlogwheredownpath=?",new 的文件长Map<nteger,nteger>data=newHashMap<nteger,cursor.moveTo{ (0), ( etColumnndexOrThrow("thread etColumn return *保存每条线程已经的文件长*@parampath的路*@parammap现在的di和已经的长度的集publicvoidsave(Stringpath,Map<nteger,nteger>{Databasedb=//开启事务,因为此处需要多条数 ntry<nteger,nteger>entry: {//特定路径特定线 D已经的数 db.execSQL("insertintofiledownlog(downpath,threadid,downlength)values(?,?,?)",newObject[]{path,entry.getKey(),}//设置一个事务成功的标志,如果成功就提交事务,如果没调用该方法的话那么务回7}}*实时更新每条线程已经的文件长*@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}}长长度的方法,这里需要添加一个synchronized关键字,用来解决并发⑤累计当前②③定义一个退 的方法④是线程池threads和同步集合ConcurrentHashMap,用于缓存线①定义一堆变量长度 ...packageimportjava.io.importjava.io.RandomAccessile;import.URL;importjava.util.Map;importjava.util.UUimportjava.util.regex.Matcher;importprivatestaticfinalStringTAG="privatestaticfinalintRESPONSEOK=类";//设置一个查log2com.jay.example.db.class{ privateileServicefileService; privateboolean //停止的标Contextint=//已的文件长3intfileSize=privateDownloadThread[] //根据线程数设置的线程privateilesave privateMap<nteger,nteger>data=newConcurrentHashMap<nteger>();//缓存个条线程的的长privateint //每条线程的长privateString //的路*4publicint{//returnreturn}**5publicvoid{this.exited= }publicboolean{return}6**publicintget{return}*累计已的大 *使用同步锁来解决并发的问 *protectedsynchronizedvoidappend(int{//把实时的长度加入到总的长度downloadedSize= *更新指定线程最后的位*@paramthreadd线程 *@parampos最后的位*protectedsynchronizedvoidupdate(intthreadd,int{//把指定线程id的线程赋予的长度,以前的值会被覆盖this.data.put(threadd,//更新数据库中制定线程的长this.fileService.update(this.downloadUrl,threadd, .*构建文件*@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 //创建连接句柄,这里并未真正连接 //设置连接超件为5 //设置用户端可以接收的类 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");//设 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");//设置 //和资源建立正在的,但尚无返回的数据 if(conn.getResponseCode()=={ this.fileSizeconn.getContentLength();//根据响应获得 if(this.fileSize0)thrownewRuntimeException("不知道文件大小");//文件长度小于等于0时抛出运行时异常Stringfilename=get ee=w;/根据存 件Map<nteger,nteger>logdata= //获取记//如果存在记if(logdata.size()> //遍历集合中的数据,把每条线程已的数据长度放入data for(Mntry<nteger,nteger>entry: data.put(entry.getKey(), if(this.data.size()== //遍历每条线程已的数 for(inti=0;i<this.threads.length;i this.downloadedSize=this.data.get(i print("已的长度 //使用条件运算符求出每个线程需要的数据长?

this.block=(this.fileSize%this.threads.length)== this.fileSize/ this.fileSize/ thrownewRuntimeException("服务器反馈出错}}catch(Exception{7 thrownewRuntimeException("无法连接}}**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";//如果都没找到的话,默认取一个6}return 20*开始文 *@paramlistener数量的变化,如果不需要了解实时的数量,可以设置*@return已文件大*@throws//进行,如果有异常的话,抛出异常给调用 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 //如果原先未曾或者原先的线程数与现在的线程数不一2 2 for(inti=0;i<this.threads.length;i) this.data.put(i,0);//初始化每条线程已经的数据长度}=//设置已经的长度为}(inti0ithis.threads.lengthi intdownLength=this.data.get(i //通过特定的线程id获取该线程已经的数据长 //判断线程是否已经完成,否则继续 if(downLength<this.block&&this.downloadedSize<this. this.threads[i]=newDownloadThread(this,url,this.saveile,this.block,this.data.get(i),i); //设置线程优先级,Thread.NORM_PRORTY= //Thread.MN_PRORTY=;Thread.MAX_PRORTY= this.threads[i] }}24//如果存在记录,删除它们,然后重新添fileService.save(this.downloadUrl,//把的实时数据写入数据库booleannotinish=//未完while(notinish)//25notinish= //假定全部线程完 for(inti=0;i<this.threads.length;i if(this.threads[i]!=null!this.threads[i].isinish()) notinish= //设置标志为没有完 if(this.threads[i].getDownLength() //如果失败,再重新在已的数据长度的基础 //重新开辟线程,设置线程的优先 this.threads[i]=newDownloadThread(this,url,this.saveile,this.block,this.data.get(i),i); //通知目前已经完成的数据长 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);//设置获取实体数据的范围 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]; 本地数据的缓存大小为MB intoffset=0; print("Thread" this.threadd startdownloadfromposition"startPos);//打印该线程开始的位置5RandomAccessilethreadfile=newRandomAccess.saveile, //用户没有要求停止,同时没有达到请求数据的末尾时会一直循环 while(!downloader.getExited()&&(offset=inStream.read(buffer,0,024))!= ){ threadfile.write(buffer,0,offset); downLength=offset; downloader.update(this.threadd,downLength);//线程已 的数据长度更新到数据库和内存哈希表 }6print("Thread this.thread"this.finish= 完成还是用户主动中}catch(Exceptione)this.downLength 该线程已 的长度print("Threadd}}}7privatestaticvoidprint(StringLog.i(TAG,} *publicbooleanisinish()return}8*已 的内容大*@return如果返回值 失publiclonggetDownLength()return}}Step5:创建一个 FileDownloader中使用了 rogressListener进行进度所以这里需要创建一个接口,同时定义一个方法的空实现 ..packagepublicinterfacerogressListenerpublicvoidonDownloadSize(int}另外调用android:enabled="false"设置组件是否可点击,代码如下 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 //失败时的Message标3 privateHandlerhandler=newUHander();privatefinalclassUHanderextendspublicvoidhandleMessage(Messagemsg)switch(msg.what)//casePROCESS intsize=msg.getData().ge //计算已经的百分比,此处需要转换为浮点数计 floatnum=(float)progressbar.getProgress()/(float)p intresult=(int)(num*00); textresult.setText(result"%"); if(progressbar.getProgress()==//完成时提 Toast.makeText(getApplicationContext(),"文件成", caseA //失败时提 Toast.makeText(getApplicationContext(),"文件失败 protectedvoidonCreate(BundlesavednstanceState)super.onCreate(savededitpath=(EditText)findViewBybtndown=(Button)findViewBybtnstop=(Button)findViewBytextresult=(TextView)findViewByprogressbar=(ProgressBar)findViewByButtonClickListenerlistener=new privatefinalclassButtonClickListenerimplementsView.OnClickListpublicvoidonCli

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论