/// <summary> /// 开始读取 /// </summary> /// <param name="URL"></param> /// <param name="CompleteCallBack"></param> /// <param name="LoadingCallBack"></param> /// <param name="EHT"> URL位置是本地还是网络 </param> /// <returns>协程</returns> private IEnumerator StartLoad(string URL, DelegateHttpLoadComplete CompleteCallBack = null, DelegateHttpLoading LoadingCallBack = null, EHttpLocation EHT = EHttpLocation.REMOTE) { if (EHT == EHttpLocation.LOCAL) { URL = "file:///" + Application.persistentDataPath + "/" + URL; CLOG.I("read local file uri={0}", URL); } else { CLOG.I("read remote file url={0}", URL); } WWW HttpObj = new WWW(URL); m_NowRunningLoaderCount++; yield return(StartCoroutine(Loading(HttpObj, CompleteCallBack, LoadingCallBack))); m_NowRunningLoaderCount--; HttpObj.Dispose(); }
/// <summary> /// 读取中 /// </summary> /// <returns></returns> public IEnumerator Loading(WWW HttpObj, DelegateHttpLoadComplete CompleteCallBack = null, DelegateHttpLoading LoadingCallBack = null) { while (!HttpObj.isDone) { if (LoadingCallBack != null) { LoadingCallBack(HttpObj); } yield return(1); } if (HttpObj.error != null) { // CLOG.W( "Http Loading Error: URL:{0} Error:{1}", HttpObj.url, HttpObj.error ); CompleteCallBack(HttpObj, false); } else { CompleteCallBack(HttpObj, true); } }
/// <summary> /// Image this扩展,读取图片 /// </summary> /// <param name="image">Imagte组件</param> /// <param name="URL">网络URL头像地址</param> /// <param name="LoadCompleteCallBack">加载完毕回调</param> public static void LoadURLImage(this Image image, string URL, DelegateURLImageLoadComplete LoadCompleteCallBack = null) { if (URL == null || URL == "") { return; } //文件类型 string TargetFileType = GetFileType(URL); //得到文件名 string TargetFileName = GetMD5HeadName(URL) + "." + TargetFileType; //本地文件名,用于判断文件是否存在 string LoacalFileName = Application.persistentDataPath + "/" + TargetFileName; //判断本地文件是否存在 FileInfo FI = new FileInfo(LoacalFileName); //存在就读取本地文件,不存在就读取网络文件 EHttpLocation EHT = FI.Exists ? EHttpLocation.LOCAL : EHttpLocation.REMOTE; //读取完毕回调 DelegateHttpLoadComplete OnComplete = (WWW HttpObj, bool isSuccess) => { try { //加载失败时的回调 if (!isSuccess) { if (LoadCompleteCallBack != null) { LoadCompleteCallBack(isSuccess); } return; } //加载成功,但是头像已销毁 if (image == null) { return; } //得到Texture Texture2D texture = HttpObj.texture; if (texture == null) { return; } //设置Image图片精灵 image.sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero); //只有远程文件才需要保存 if (EHT == EHttpLocation.REMOTE) { //得到字节流 byte[] ImageData = null; if (TargetFileType == "jpg" || TargetFileType == "jpeg") { ImageData = texture.EncodeToJPG(); } else if (TargetFileType == "png") { ImageData = texture.EncodeToPNG(); } //保存路径 string SaveURl = Application.persistentDataPath + "/" + TargetFileName; CLOG.I("read http remote data complete , Start save image to {0}!", SaveURl); //保存文件 if (ImageData != null) { File.WriteAllBytes(SaveURl, ImageData); } else { CLOG.E("Write file {0} error!", SaveURl); } } //执行回调 if (LoadCompleteCallBack != null) { LoadCompleteCallBack(isSuccess); } } catch (Exception ex) { CLOG.I("********** don't warry it's OK ************"); CLOG.E(ex.ToString()); CLOG.I("*********************************************"); } }; //读取中回调 DelegateHttpLoading OnLoading = null; /* (WWW HttpObj) => * { * * }; */ //创建HTTP加载器 if (EHT == EHttpLocation.REMOTE) { //加载网络头像 CHttp.Instance.CreateHttpLoader(URL, OnComplete, OnLoading, EHT); } else if (EHT == EHttpLocation.LOCAL) { //加载本地文件 CHttp.Instance.CreateHttpLoader(TargetFileName, OnComplete, OnLoading, EHT); } }
//private Dictionary<string, Coroutine> MissionList = new Dictionary<string, Coroutine>(); /// <summary> /// 创建一个HTTP下载任务 /// </summary> /// <param name="URL"> URL </param> /// <param name="CompleteCallBack"> 完成回调 </param> /// <param name="LoadingCallBack"> 下载中回调 </param> /// <param name="EHT"> URL位置是本地还是网络 </param> public void CreateHttpLoader(string URL, DelegateHttpLoadComplete CompleteCallBack = null, DelegateHttpLoading LoadingCallBack = null, EHttpLocation EHT = EHttpLocation.REMOTE) { StartCoroutine(StartLoad(URL, CompleteCallBack, LoadingCallBack, EHT)); }