码迷,mamicode.com
首页 > 编程语言 > 详细

unity下载文件三(http异步下载)

时间:2016-04-11 13:52:41      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

异步下载,顾名思义就是不影响你主线程使用客户端的时候,人家在后台搞你的明堂。

直接入主题,既然要下载,首先得请求,请求成功之后进行回调,这就是一个异步过程,异步回调的时间不可控。

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异步下载)

标签:

原文地址:http://www.cnblogs.com/vsirWaiter/p/5377788.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!