版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本章教学目标上传下载用户权限多线程实现Android上传下载文件HandlerAsyncTask上传文件Android端使用HttpClient上传文件服务器端构建SpringBoot工程编写上传Controller使用MultipartFile保存上传文件下载文件Android端使用HttpClient下载文件服务器端使用HttpServletResponse以流的方式提供文件下载功能上传下载进度更新多线程实现Android上传下载文件Handler是一套Android消息传递机制,主要用于线程间通信。
handler其实就是主线程在起了一个子线程,子线程运行并生成Message,Looper获取message并传递给Handler,Handler逐个获取子线程中的Message.Binder/Socket用于进程间通信,而Handler消息机制用于同进程的线程间通信可以说只要有异步线程与主线程通信的地方就一定会有Handler。在多线程的应用场景中,将工作线程中需更新UI的操作信息传递到UI主线程,从而实现工作线程对UI的更新处理,最终实现异步消息的处理使用Handler消息传递机制主要是为了多个线程并发更新UI的同时,保证线程安全多线程实现Android上传下载文件Handler多线程实现Android上传下载文件Handler相关概念解释Message:代表一个行为what或者一串动作Runnable,每一个消息在加入消息队列时,都有明确的目标HandlerThreadLocal:线程本地存储区(ThreadLocalStorage,简称为TLS),每个线程都有自己的私有的本地存储区域,不同线程之间彼此不能访问对方的TLS区域。ThreadLocal的作用是提供线程内的局部变量TLS,这种变量在线程的生命周期内起作用,每一个线程有他自己所属的值(线程隔离)MessageQueue(C层与Java层都有实现):以队列的形式对外提供插入和删除的工作,其内部结构是以双向链表的形式存储消息的Looper(C层与Java层都有实现):Looper是循环的意思,它负责从消息队列中循环的取出消息然后把消息交给Handler处理Handler:消息的真正处理者,具备获取消息、发送消息、处理消息、移除消息等功能多线程实现Android上传下载文件HandlerAndroid消息机制以Handler的sendMessage方法为例,当发送一个消息后,会将此消息加入消息队列MessageQueue中。Looper负责去遍历消息队列并且将队列中的消息分发给对应的Handler进行处理。在Handler的handleMessage方法中处理该消息,这就完成了一个消息的发送和处理过程。多线程实现Android上传下载文件Handler基本使用创建Handler(将Handler定义成静态的内部类)staticclassMyHandlerextendsHandler{
//弱引用持有HandlerActivity,GC回收时会被回收掉
privateWeakReference<MainActivity>weakReference;
publicMyHandler(MainActivityactivity){
this.weakReference=newWeakReference(activity);
}
@Override
publicvoidhandleMessage(Messagemsg){
MainActivityactivity=weakReference.get();
super.handleMessage(msg);
if(null!=activity){
//执行业务逻辑
Toast.makeText(activity,"handleMessage",Toast.LENGTH_SHORT).show();
}
}
}多线程实现Android上传下载文件Handler基本使用Message获取Messagemessage=newMyHandler().obtainMessage();//通过
Handler实例获取
Messagemessage1=Message.obtain();//通过
Message获取
Messagemessage2=newMessage();//直接创建新的
Message实例
多线程实现Android上传下载文件Handler基本使用发送MessagesendEmptyMessage(int)sendEmptyMessageDelayed(int,int)sendMessageAtTime(Message,long)多线程实现Android上传下载文件AsyncTaskAsynctask是一个抽象类,它是Android封装的一个轻量级异步类(轻量级体现在使用方便,代码简洁),它可以在线程池中执行后台任务,然后把执行的进度和最终的结果呈现给主线程,并且更新UI。
AsyncTask的泛型参数publicabstractclassAsyncTask<Params,Progress,Result>{}Params:开始异步任务执行时传入的参数类型。Progress:异步任务执行过程中,返回下载进度值的类型。Result:异步任务执行完成,返回的结果类型。如果AsyncTask确定不需要传递具体参数,那么这三个泛型参数可以用Void来代替。多线程实现Android上传下载文件AsyncTaskAsyncTask的核心方法onPreExecute()(主线程中执行):这个方法会在后台任务开始执行前调用,在主线程执行。用于进行一些界面上的初始化操作,比如显示一个对话框列表什么的。doInBackground(Params...)(子线程中执行):这个方法在子线程中执行,负责处理耗时操作。任务一旦完成就可以通过return语句来将任务的执行结果进行返回,如果AsyncTask的第三个参数指定的是Void,就可以不返回执行结果。如果要更新UI,可以通过调用publishProgress(Progess...)方法来完成比如反馈当前的进度。
onProgressUpdate(Progress...)(主线程中执行):当在后台进程中调用publishProgress(Progress...)方法后,这个方法就会被调用,方法中携带的参数就是后台任务中传递过来的。在这个方法中可以对UI进行更新操作。多线程实现Android上传下载文件AsyncTaskAsyncTask的核心方法onPostExecute(Result)(主线程中执行):当doInBackground(Params...)执行完毕并通过return语句进行返回时,这个方法就很快会被调用。返回的数据会作为参数传递到这个方法里面。利用参数的数据,就可以进行UI的修改。上面几个方法的调用顺序:onPreExcute()-->doInBackground()-->publishProgress()-->onProgressUpdate()-->onPostExcute()onCancelled()(主线程中执行):该方法被调用,onPostExecute()方法将不会被执行,需要注意的是,AsncTask中的cancel()不是真正的取消任务,只是将任务标记为取消状态,我们需要在doInBackground()内判断终止任务。多线程实现Android上传下载文件AsyncTaskAsyncTask的简单使用多线程实现Android上传下载文件AsyncTaskAsyncTask的简单使用publicclassDownloadTaskextendsAsyncTask<Void,Integer,Boolean>{
@Override
protectedvoidonPreExecute(){
progressDialog.show();
}
@Override
protectedBooleandoInBackground(Void...voids){
try{
while(true){
intdownloadPercent=doDownload();
publishProgress(downloadPercent);
if(downloadPercent>=100){
break;
}
}
}catch(Exceptione){
returnfalse;
}
returntrue;
}
@Override
protectedvoidonProgressUpdate(Integer...values){
progressDialog.setMessage("当前下载进度:
"+values[0]+"%");
}
@Override
protectedvoidonPostExecute(Booleanresult){
progressDialog.dismiss();
if(result){
Toast.makeText(context,"下载成功",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context,"下载失败",Toast.LENGTH_SHORT).show();
}
}
}上传文件Android端使用HttpClient上传文件添加依赖发送上传请求compile'org.apache.httpcomponents:httpcore:4.3.3'
compile'org.apache.httpcomponents:httpmime:4.3.6'上传文件
HttpClienthc=newDefaultHttpClient();
hc.getParams().setParameter(
CoreProtocolPNames.PROTOCOL_VERSION,HttpVersion.HTTP_1_1);
HttpPosthp=newHttpPost(uploadUrl);
Filefile=newFile(filePath);
finalMultipartEntityentity=newMultipartEntity();
ContentBodycontentBody=newFileBody(file);
entity.addPart(“file”,contentBody);
hp.setEntity(entity);
HttpResponsehr=hc.execute(hp);
HttpEntityhe=hr.getEntity();
intstatusCode=hr.getStatusLine().getStatusCode();
if(statusCode!=HttpStatus.SC_OK)
thrownewException(“HTTPRequestError!”);
result=EntityUtils.toString(he,HTTP.UTF_8);上传文件服务端构建SpringBoot工程编写上传Controller使用MultipartFile保存上传文件@RestController
publicclassFileUploadController{
@RequestMapping("/upload")
publicStringupload(@RequestParam(value="file")MultipartFileuploadfile)throwsIOException{
Stringfilename=uploadfile.getOriginalFilename();
uploadfile.transferTo(newFile("D://mp3//"+filename));
return"OK";
}}下载文件Android端使用HttpClient下载文件HttpClientclient=newHttpClient();
GetMethodget=null;
FileOutputStreamoutput=null;
try{
get=newGetMethod(url+“?fileName=”+fileName);
inti=client.executeMethod(get);
if(200==i){
FilestoreFile=newFile(“pic//”+fileName);
output=newFileOutputStream(storeFile);
//得到网络资源的字节数组,并写入文件
output.write(get.getResponseBody());
}else{}
}catch(Exceptione){
e.printStackTrace();
}下载文件服务器端使用HttpServletResponse以流的方式提供文件下载功能InputStreaminputStream=newBufferedInputStream(newFileInputStream(file));
//创建缓冲区
byte[]buffer=newbyte[inputStream.available()];
inputStream.read(buffer);
inputStream.close();
OutputStreamoutputStream=newBufferedOutputStream(response
.getOutputStream());
outputStream.write(buffer);
outputStream.flush();
outputStream.close();上传下载进度更新定义上传进度监听器ListenerpublicstaticinterfaceOnUploadProcessListe
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个人自查报告
- 2024年河北省中考化学仿真卷28
- 挑战11作图题(光学综合30题)(解析版)-2022年中考物理真题《压轴挑战》分类汇编
- 人教版七年级下册地理期末试卷二
- 2023六一儿童节晚会策划方案-1
- Sherry baby月子中心会所创业计划书
- 家政公司劳动合同
- 《第2单元 100以内的加法和减法(二):2.5连加连减》教案(附导学案)
- 贺雅彬装修合同正版
- 食品行业技能鉴定考试:粮油保管员试题预测(三)
- 工业互联网+危险化学品企业 安全风险智能化管控平台
- 建筑项目厂房施工方案
- 网易游戏营销策略研究分析 市场营销专业
- 静脉血栓栓塞防治进展课件
- 2024届浙江省宁波镇海区六校联考中考押题数学预测卷含解析
- 2021年10月自考00157管理会计一试题及答案含解析
- 药品不良事件分析报告
- 旅游公司的商业计划书
- 视觉影像力(摄影的视觉设计与思路创建)
- DB11-T 2205-2023 建筑垃圾再生回填材料应用技术规程
- ESG与人工智能融合
评论
0/150
提交评论