unity下载文件三(http异步下载)
异步下载,顾名思义就是不影响你主线程使用客户端的时候,人家在后台搞你的明堂。
直接入主题,既然要下载,首先得请求,请求成功之后进行回调,这就是一个异步过程,异步回调的时间不可控。
1、首先请求下载。
public bool DownLoadFile(DownLoadFileModel file)
{ try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://192.168.1.1:8080/" + file.FileName);
//DownLoadFileModel 为我自己定义的一个实体类,文件名需要带后缀名
file.request = request;//实体类中将http的请求信息也带进去了,方便回调中的判断
request.BeginGetResponse(new AsyncCallback(ResponseCallbackDownLoad), file);
//ResponseCallbackDownLoad请求成功后的回调方法
return true;
}
catch
{
return false;
}
}
2、请求成功之后就会去调用ResponseCallbackDownLoad方法,这个方法是异步的,是在子线程里执行,如果在消息者模式下在这个回调里面发送监听到主线程,再操作GameObject对象就会报错,或者直接调用主线程的GameObject也会报错,至于怎么去获取这个下载的信息并操作界面,我想这个我想我就不用多说了。不多说了,上回调代码,回调代码是在子线程里执行。
private void ResponseCallbackDownLoad(IAsyncResult ar)
{
//throw new NotImplementedException();
try
{
object req = ar.AsyncState as object;;
if (req == null) return;
DownLoadFileModel file = ar.AsyncState as DownLoadFileModel;//获取异步下载的请求的相关信息,以便判断
HttpWebResponse response = file.request.EndGetResponse(ar) as HttpWebResponse;
if (response.StatusCode != HttpStatusCode.OK)
{
response.Close();
return;
}
Stream outStream;
Stream inStream = response.GetResponseStream(); byte[] b = new byte[1024];
FileInfo fi = new FileInfo(Application.persistentDataPath+ "//" + file.SaveName);
if (fi.Exists)
{
//TODO如果文件件存在,TODO
}
else //else如果该文件不存在
{
try
{
int readCount = inStream.Read(b, 0, b.Length);
outStream = fi.Create();
long fileLength = response.ContentLength;//获取文件总长度
long fileSize = 0;//已下载的文件长度
while (readCount > 0)
{
outStream.Write(b, 0, readCount);
fileSize += readCount;
int progress = (int)(((float)fileSize / (float)fileLength) * 100);//progress 为计算下载的百分比
readCount = inStream.Read(b, 0, b.Length);
}
outStream.Close();
inStream.Close();
response.Close();
}
} catch (Exception ex)
{
}
} }
catch (Exception ex)
{ Debug.Log("文件下载失败" + ex.Message);
}
}
}
unity下载文件三(http异步下载)的更多相关文章
- Python之FTP多线程下载文件之多线程分块下载文件
Python之FTP多线程下载文件之多线程分块下载文件 Python中的ftplib模块用于对FTP的相关操作,常见的如下载,上传等.使用python从FTP下载较大的文件时,往往比较耗时,如何提高从 ...
- winform自动更新并实现文件的批量异步下载
public partial class update : Form { private WebClient client; int downfilenum = 0; ...
- flask上传下载文件(一)下载
简介: 作为一个可以和用户交互的web应用,必然要有数据导出功能,导出到excel是比较常用的方式. flask有一个扩展叫flask-excel,可能不适合中国人用,因为没有看到修改列名的功能.也许 ...
- ASP.NET Core 返回文件、用户下载文件,从网站下载文件,动态下载文件
ASP.NET Core 中,可以在静态目录添加文件,直接访问就可以下载.但是这种方法可能不安全,也不够灵活. 我们可以在 Controller 控制器中 添加 一个 Action,通过此Action ...
- java 多线程下载文件并实时计算下载百分比(断点续传)
多线程下载文件 多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责下载其中的一部分,最后将每一个线程下载的部分组装起来 ...
- 使用隐藏form表单下载文件,解决url方式下载,由于环境问题而限制url长度,满足不了所有的需求!
一 对于某些环境导出是直接用wiondow.href=url直接导出下载,有些业务需求,如员工档案等字段比较多的时候,全选导出就会引发异常,由于Nginx转发长度限制的问题, 如果运维不愿意改变环境, ...
- php curl下载文件由于空格导致下载文件失败
<?php //$result=httpcopy('http://www.phpernote.com/image/logo.gif'); echo '<pre>';print_r($ ...
- python下载mp4 同步和异步下载支持断点续下
Range 用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式: Range:(unit=first byte pos)-[last byte pos] Range 头部的格式有以下几种 ...
- asp.net中用FileStream类实现下载文件功能,自定义下载路径,像IE下载一样
方法一: //这个值可以从配置文件读取,或者放个textbox让用户填 string path = "你的路径";FileStream outputStream = new Fil ...
随机推荐
- 12306外包给阿里巴巴/IBM到底是否可行?
春运开始以后 12306 免不了要罢工几次,毕竟人民群众买票回家的热情实在是高涨,12306 很难承受如此大的压力.每次 12306 网站罢工以后都会有人忍不住对其进行吐槽,而还有人认为如果把 123 ...
- PE渲染引擎 三
加进了SSAO,讲真这个东西,很容易忽略他的存在.并且动态的话,会有闪烁. 下面两幅图,单独给你看一张,应该看不出去区别....依旧是浓重风格,这个tongmaping,哪位大神指教下.....
- nodejs中常用加密算法
在常用的nodejs+express工程中,为了安全在登录及表单传输时,应该都需进行加密传输,目前个人常用到的加密方式有下列几种: 1.Hash算法加密: 创建一个nodejs文件hash.js,输入 ...
- EXCEL 数字+E+数字 自动识别为指数形式的解决办法
1.今天从数据库导出excel表时,出现本来为"2E3"的单元格错误显示为"2.00E+03"的情况 2.而设置 单元格格式 为"文本"后, ...
- [linux笔记]理清linux安装程序用到的(configure, make, make install)
我作为一名经常和linux打交道的程序员,每次在linux安装软件都祈求可以用——apt-get,yum,brew等应用程序管理器安装,有的时候事与愿违,你只能自己编译安装-wtf,说好的美丽世界呢? ...
- SQL Server中的事务日志管理(4/9):简单恢复模式里的日志管理
当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会 ...
- Java中接口式的匿名内部类的构造方法
在使用多线程的时候,时常会使用两种方式实现,一种是直接继承Thread类来实现多线程,另外一种就是实现Runnable接口. 我们都知道,接口是没有构造方法的,同时匿名内部类也是没有构造方法的.原因有 ...
- 准备.Net转前端开发-WPF界面框架那些事,搭建基础框架
题外话 最近都没怎么写博客,主要是最近在看WPF方面的书<wpf-4-unleashed.pdf>,挑了比较重要的几个章节学习了下WPF基础技术.另外,也把这本书推荐给目前正在从事WPF开 ...
- WPF关闭应用程序方法
很多人认为关闭应用程序应该很简单,例如WindowsForm里一个Application.Exit();方法就可以解决问题,但在WPF里面可别滥用,因为WPF里Application类没有该方法,倒是 ...
- EasyUI文档学习心得
概述 jQuery EasyUI 是一组基于jQuery 的UI 插件集合,它可以让开发者在几乎完全不需要CSS以及复杂的JS代码情况下完成美观且功能强大的Web界面. 本文主要说明一些如何利用Eas ...