zoukankan      html  css  js  c++  java
  • 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游戏的主程,我为自己带盐,希望此文能给您一点点微不足道的帮助,祝你成功!
  • 相关阅读:
    [学习笔记]Nim游戏&SG函数
    [vijos1783][NOIP2012]疫情控制
    [vijos1782][NOIP2012]借教室
    [学习笔记]递推问题选讲
    [vijos1779][NOIP2012]国王游戏
    NET中使用三层构架如何从DAL层读取web.config中的数据库连接字符串!
    转:一个不错的网页进度条
    转:在没有数据时,如何使用FormView增加数据
    asp.net 2.0中的MessageBox.Show()方法
    TreeView与MultiView,View三个控件的组合使用
  • 原文地址:https://www.cnblogs.com/vsirWaiter/p/5377788.html
Copyright © 2011-2022 走看看