225 lines
7.2 KiB
C#
225 lines
7.2 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.IO;
|
|||
|
using System.Text;
|
|||
|
using System.Threading;
|
|||
|
using Thousandto.Update.Singleton;
|
|||
|
using Thousandto.Update.Enum;
|
|||
|
using Thousandto.Update.Delegate;
|
|||
|
using Thousandto.Update.Flow;
|
|||
|
using Thousandto.Update.Log;
|
|||
|
|
|||
|
namespace Thousandto.Update.Manager
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 一些回调函数是从线程触发的,需要转为UI调用
|
|||
|
/// 这个类就是把函数调用转成UI调用的
|
|||
|
/// </summary>
|
|||
|
public partial class UpdateManager : Singleton<UpdateManager>
|
|||
|
{
|
|||
|
TransResourceFinishCallback _transFinishConvertCallback;
|
|||
|
ClientDownloadFinishCallback _clienDownloadFinishConvertCallback;
|
|||
|
DownloadNoticeCall _downloadNoticeConvertCallback;
|
|||
|
FinishCallback _finishConvertCallback;
|
|||
|
ActionCall _actionCall;
|
|||
|
private UpdateAction<string, int, object> _myActionCall;
|
|||
|
|
|||
|
List<KeyValuePair<ConvertFuncEnum, object>> _argList = new List<KeyValuePair<ConvertFuncEnum, object>>();
|
|||
|
object _locker = new object();
|
|||
|
|
|||
|
//是否配置了Update函数在UI线程
|
|||
|
bool _useUpdate = false;
|
|||
|
|
|||
|
//计数器
|
|||
|
int _counter = 0;
|
|||
|
|
|||
|
private void convertFuncTransResourceFinishCallback(TransResourceFinishCallback callback)
|
|||
|
{
|
|||
|
_transFinishConvertCallback = callback;
|
|||
|
}
|
|||
|
|
|||
|
private void convertFuncClientDownloadFinishCallback(ClientDownloadFinishCallback callback)
|
|||
|
{
|
|||
|
_clienDownloadFinishConvertCallback = callback;
|
|||
|
}
|
|||
|
|
|||
|
private void convertFuncDownloadNoticeCall(DownloadNoticeCall callback)
|
|||
|
{
|
|||
|
_downloadNoticeConvertCallback = callback;
|
|||
|
}
|
|||
|
|
|||
|
private void convertFuncFinishCallback(FinishCallback callback)
|
|||
|
{
|
|||
|
_finishConvertCallback = callback;
|
|||
|
}
|
|||
|
|
|||
|
private void convertActionCall(ActionCall callback)
|
|||
|
{
|
|||
|
_actionCall = callback;
|
|||
|
}
|
|||
|
|
|||
|
private UpdateAction<string, int, object> convertMyActionCall(UpdateAction<string, int, object> callback)
|
|||
|
{
|
|||
|
this._myActionCall = callback;
|
|||
|
return new UpdateAction<string, int, object>(this.onMyActionCallback);
|
|||
|
}
|
|||
|
|
|||
|
private void onTransResourceFinishCallback(bool success)
|
|||
|
{
|
|||
|
if (!_useUpdate)
|
|||
|
{
|
|||
|
callUIFunc(ConvertFuncEnum.TransFunc, success);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
lock (_locker)
|
|||
|
{
|
|||
|
_counter++;
|
|||
|
KeyValuePair<ConvertFuncEnum, object> keyP = new KeyValuePair<ConvertFuncEnum, object>(ConvertFuncEnum.TransFunc, success);
|
|||
|
_argList.Add(keyP);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void onClientDownloadFinishCallback(bool success)
|
|||
|
{
|
|||
|
if (!_useUpdate)
|
|||
|
{
|
|||
|
callUIFunc(ConvertFuncEnum.DownloadClientFunc, success);
|
|||
|
return;
|
|||
|
}
|
|||
|
lock (_locker)
|
|||
|
{
|
|||
|
_counter++;
|
|||
|
_argList.Add(new KeyValuePair<ConvertFuncEnum, object>(ConvertFuncEnum.DownloadClientFunc, success));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void onDownloadNoticeCall(int size)
|
|||
|
{
|
|||
|
if (!_useUpdate)
|
|||
|
{
|
|||
|
callUIFunc(ConvertFuncEnum.NoticeFunc, size);
|
|||
|
return;
|
|||
|
}
|
|||
|
lock (_locker)
|
|||
|
{
|
|||
|
_counter++;
|
|||
|
_argList.Add(new KeyValuePair<ConvertFuncEnum, object>(ConvertFuncEnum.NoticeFunc, size));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void onActionCall(object obj)
|
|||
|
{
|
|||
|
if (!_useUpdate)
|
|||
|
{
|
|||
|
callUIFunc(ConvertFuncEnum.ActionCallFunc, obj);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
lock (_locker)
|
|||
|
{
|
|||
|
_counter++;
|
|||
|
_argList.Add(new KeyValuePair<ConvertFuncEnum, object>(ConvertFuncEnum.ActionCallFunc, obj));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void onFinishCallback(bool success, int ret)
|
|||
|
{
|
|||
|
if (!_useUpdate)
|
|||
|
{
|
|||
|
object[] args = new object[] { success, ret };
|
|||
|
callUIFunc(ConvertFuncEnum.FinishFunc, args);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
lock (_locker)
|
|||
|
{
|
|||
|
_counter++;
|
|||
|
object[] args = new object[] { success, ret };
|
|||
|
_argList.Add(new KeyValuePair<ConvertFuncEnum, object>(ConvertFuncEnum.FinishFunc, args));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void onMyActionCallback(string path, int result, object obj)
|
|||
|
{
|
|||
|
object[] objArray;
|
|||
|
if (!this._useUpdate)
|
|||
|
{
|
|||
|
objArray = new object[] { path, result, obj };
|
|||
|
this.callUIFunc(ConvertFuncEnum.CheckResFunc, objArray);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
lock (this._locker)
|
|||
|
{
|
|||
|
this._counter++;
|
|||
|
objArray = new object[] { path, result, obj };
|
|||
|
this._argList.Add(new KeyValuePair<ConvertFuncEnum, object>(ConvertFuncEnum.CheckResFunc, objArray));
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void callUIFunc(ConvertFuncEnum funcType, object args)
|
|||
|
{
|
|||
|
switch (funcType)
|
|||
|
{
|
|||
|
case ConvertFuncEnum.DownloadClientFunc:
|
|||
|
if (_clienDownloadFinishConvertCallback != null)
|
|||
|
_clienDownloadFinishConvertCallback((bool)args);
|
|||
|
break;
|
|||
|
case ConvertFuncEnum.FinishFunc:
|
|||
|
object[] arg2 = (object[])args;
|
|||
|
if (_finishConvertCallback != null)
|
|||
|
_finishConvertCallback((bool)arg2[0], (int)arg2[1]);
|
|||
|
break;
|
|||
|
case ConvertFuncEnum.NoticeFunc:
|
|||
|
if (_downloadNoticeConvertCallback != null)
|
|||
|
_downloadNoticeConvertCallback((int)args);
|
|||
|
break;
|
|||
|
case ConvertFuncEnum.TransFunc:
|
|||
|
if (_transFinishConvertCallback != null)
|
|||
|
_transFinishConvertCallback((bool)args);
|
|||
|
break;
|
|||
|
case ConvertFuncEnum.ActionCallFunc:
|
|||
|
if (_actionCall != null)
|
|||
|
_actionCall(null);
|
|||
|
break;
|
|||
|
case ConvertFuncEnum.CheckResFunc:
|
|||
|
{
|
|||
|
object[] objArray2 = (object[])args;
|
|||
|
if (this._myActionCall != null)
|
|||
|
{
|
|||
|
this._myActionCall((string)objArray2[0], (int)objArray2[1], objArray2[2]);
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 将这个Update函数放到UI线程的Update方法里面调用
|
|||
|
/// </summary>
|
|||
|
public void Update()
|
|||
|
{
|
|||
|
if (!_useUpdate)
|
|||
|
{
|
|||
|
_useUpdate = true;
|
|||
|
}
|
|||
|
|
|||
|
if (_counter > 0)
|
|||
|
{
|
|||
|
lock (_locker)
|
|||
|
{
|
|||
|
for (int i = 0; i < _argList.Count; ++i)
|
|||
|
{
|
|||
|
_counter--;
|
|||
|
callUIFunc(_argList[i].Key, _argList[i].Value);
|
|||
|
}
|
|||
|
|
|||
|
_argList.Clear();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|