private void UnzipFileThread(object obj)
        {
            int delatime = (int)obj;

            DebugUtils.Log(DebugUtils.Type.AssetBundle, "Unzip file thread run! time:" + delatime);

            // read 2048
            int size = 2048;

            byte[] readData = new byte[size];
            while (true)
            {
                if (unzipComplete && curUnZipData != null)
                {
                    try
                    {
                        FileStream fs = null;
                        // del old file and create a new file
                        if (File.Exists(curUnZipData.targetPath))
                        {
                            File.Delete(curUnZipData.targetPath);
                        }
                        fs = File.Create(curUnZipData.targetPath);
                        while (true)
                        {
                            size = curUnZipData.stream.Read(readData, 0, readData.Length);
                            if (size > 0)
                            {
                                fs.Write(readData, 0, size);
                            }
                            else
                            {
                                break;
                            }
                        }
                        fs.Close();
                        fs.Dispose();
                        DebugUtils.Log(DebugUtils.Type.AssetBundle, "unzip complete! path:" + curUnZipData.sourcePath);
                    }
                    catch (System.Exception e)
                    {
                        DebugUtils.LogError(DebugUtils.Type.AssetBundle, string.Format("unzip err! path:{0} msg:{1}", curUnZipData.targetPath, e.Message));
                    }
                    curUnZipData.sourcePath = curUnZipData.sourcePath.Replace("file:///", "");
                    //Delete local zip file
                    #if UNITY_EDITOR
                    File.Delete(curUnZipData.sourcePath);
                    #else
                    if (curUnZipData.sourcePath.StartsWith(zipAssetPath))
                    {
                        File.Delete(curUnZipData.sourcePath);
                    }
                    #endif
                    unzipComplete = false;
                    curUnZipData  = null;
                    upZipProgressData.curIndex++;
                }
                else
                {
                    Thread.Sleep(delatime);
                }
            }
        }
        private IEnumerator UnzipFileHandler(Queue <string> queue, string bundDataTime, Callback callback)
        {
            ZipInputStream    zipInputStream = null;
            ZipEntry          zipEntry       = null;
            WaitForEndOfFrame waitFrame      = new WaitForEndOfFrame();
            Thread            unzipThread    = new Thread(new ParameterizedThreadStart(UnzipFileThread));
            int delatime = (int)(Time.deltaTime * 1000);

            unzipThread.Start(delatime);

            while (queue.Count != 0)
            {
                string localUrl = queue.Dequeue();
                WWW    www      = new WWW(localUrl);
                yield return(www);

                if (!string.IsNullOrEmpty(www.error))
                {
                    //DebugUtils.LogError( DebugUtils.Type.AssetBundle, string.Format( "Loading zip file failed! when decompress zip! err: {0}  url = {1}", www.error, localUrl ) );
                    www.Dispose();
                    www = null;
                    continue;
                }

                zipInputStream          = new ZipInputStream(new MemoryStream(www.bytes, 0, www.bytes.Length), true);
                zipInputStream.Password = "******";
                while ((zipEntry = zipInputStream.GetNextEntry()) != null)
                {
                    curUnZipData            = new UnZipData();
                    curUnZipData.sourcePath = localUrl;
                    curUnZipData.targetPath = assetPath + zipEntry.FileName;
                    curUnZipData.stream     = zipInputStream;
                    unzipComplete           = true;

                    while (unzipComplete)
                    {
                        yield return(waitFrame);
                    }
                }

                www.Dispose();
                www = null;
            }

            DebugUtils.Log(DebugUtils.Type.AssetBundle, "unzip all files complete!");

            RemoveLocalZipListFile();
            unzipThread.Abort();
            unzipThread = null;
            using (FileStream fs = new FileStream(zipAssetPath + cacheDataTimeTxt, FileMode.OpenOrCreate))
            {
                using (StreamWriter sw = new StreamWriter(fs))
                {
                    sw.WriteLine(bundDataTime);
                    sw.Close();
                    sw.Dispose();
                }
                fs.Close();
                fs.Dispose();
            }
            System.GC.Collect();

            if (callback != null)
            {
                callback();
            }
        }