private void OnSucceed(string url, byte[] raw, object userData) { switch (mPreStep) { case Step.HashmapHash: { // 和本地的HashmapHash进行对比 mServerHash = new UTF8Encoding(false).GetString(raw); string local_hashmaphash = GetLocalHashmapHash(); if (string.Equals(local_hashmaphash, mServerHash)) { SendLocalMapToAssetManager(); Finish(); } else mStep = Step.Hashmap; } break; case Step.Hashmap: { mServerFiles = new UTF8Encoding(false).GetString(raw); string[] array = mServerFiles.Replace("\r\n", "\n").Split('\n'); mUpdateQueue = new Queue<string>(array.Length);// 筛选出待更新的项 mTotalUpdateSize = 0u; for (int i = 0; i < array.Length; i++) { string line = array[i]; if (string.IsNullOrEmpty(line)) continue; string[] cells = line.Split('|'); if (cells == null || cells.Length == 0) continue; string key = cells[0]; AssetCfg item = new AssetCfg(cells, GetLocalItemHash(key)); AssetManager.AddCfg(item); if (item.needUpdate) { mUpdateQueue.Enqueue(key); mTotalUpdateSize += item.size; } } mUpdateQueue.TrimExcess(); // 选择Patch或更新 if (mUpdateQueue.Count == 0) { SendLocalMapToAssetManager(); mStep = Step.Patch; onProgress(null, 1f); } else { mStep = Step.Update; mUpdatedSize = 0u; onProgress(null, 0f); } } break; case Step.Update: { // 写入到Raw中 string key = userData.ToString(); string rawPath = GetRawPath(key, true); File.WriteAllBytes(rawPath, raw); // 检查队列 if (mUpdateQueue.Count > 0) mStep = Step.Update; else mStep = Step.Patch; // 更新进度 AssetCfg item = AssetManager.GetCfg(key); mUpdatedSize += item.size; float percent = (mUpdatedSize * 1.0f / mTotalUpdateSize); onProgress(key, percent); } break; } }