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);
        }
    }
}    

  

 

posted @ 2016-04-11 12:10  威少小二orz  阅读(2216)  评论(0编辑  收藏  举报