标签:
异步下载,顾名思义就是不影响你主线程使用客户端的时候,人家在后台搞你的明堂。
直接入主题,既然要下载,首先得请求,请求成功之后进行回调,这就是一个异步过程,异步回调的时间不可控。
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); } } }
标签:
原文地址:http://www.cnblogs.com/vsirWaiter/p/5377788.html