GameFramework中的WebRequest
类图
使用
先在 WebRequestComponent 中配置:
- WebRequest Agent Helper Count 下载器数量
public class TestWebRequest
{
static int s_WebRequestId;
public static void Test()
{
GameEntry.Event.Subscribe(WebRequestSuccessEventArgs.EventId, OnWebRequestSuccess);
GameEntry.Event.Subscribe(WebRequestFailureEventArgs.EventId, OnWebRequestFailure);
// 向服务器请求版本信息
s_WebRequestId = GameEntry.WebRequest.AddWebRequest(Utility.Text.Format(GameEntry.BuiltinData.BuildInfo.CheckVersionUrl, GetPlatformPath()), this);
}
private static void OnWebRequestSuccess(object sender, GameEventArgs e)
{
// 下载成功
WebRequestSuccessEventArgs args = (WebRequestSuccessEventArgs)e;
// 有2种方式判断这个下载是不是你要的下载
// 1. GameFramework内置方式,通过 SerialId 判断
if ( args.SerialId != s_WebRequestId )
return ;
// 2. 你在用户数据中传递一个唯一的索引进行判断
if ( !(args.UserData == this) )
return ;
}
private static void OnWebRequestFailure(object sender, GameEventArgs e)
{
WebRequestFailureEventArgs args = (WebRequestFailureEventArgs)e;
// 判断是否你的下载,同 OnWebRequestSuccess
Debug.Log(args.ErrorMessage);
}
}
代码分析
WebRequestComponent.Start()
{
// 添加下载器
for (int i = 0; i < m_WebRequestAgentHelperCount; i++)
{
AddWebRequestAgentHelper(i)
{
m_WebRequestManager.AddWebRequestAgentHelper(webRequestAgentHelper) // WebRequestManager.AddWebRequestAgentHelper(IWebRequestAgentHelper webRequestAgentHelper)
{
WebRequestAgent agent = new WebRequestAgent(webRequestAgentHelper);
m_TaskPool.AddAgent(agent)
{
agent.Initialize();
m_FreeAgents.Push(agent); // 加入空闲队列中
}
}
}
}
}
WebRequestManager.AddWebRequest(string webRequestUri, byte[] postData, string tag, int priority, object userData)
{
// 创建下载任务并加入任务池中
WebRequestTask webRequestTask = WebRequestTask.Create(webRequestUri, postData, tag, priority, m_Timeout, userData);
m_TaskPool.AddTask(webRequestTask)
{
m_WaitingTasks.AddAfter(current, task); // 任务加入等待队列
}
return webRequestTask.SerialId;
}
// 执行下载任务
WebRequestManager.Update(float elapseSeconds, float realElapseSeconds)
{
m_TaskPool.Update(elapseSeconds, realElapseSeconds) // TaskPool<WebRequestTask>.Update
{
ProcessRunningTasks(elapseSeconds, realElapseSeconds)
{
WebRequestAgent taskAgent = m_WorkingAgents.First;
taskAgent.Update(elapseSeconds, realElapseSeconds)
{
// 判断正在下载的任务是否超时
}
}
ProcessWaitingTasks(elapseSeconds, realElapseSeconds) // TaskPool<WebRequestTask>.ProcessWaitingTasks
{
LinkedListNode<WebRequestTask> current = m_WaitingTasks.First; // 从等待列表中取出第1个任务
WebRequestTask task = current.Value;
ITaskAgent<WebRequestTask> agent = m_FreeAgents.Pop(); // 获得空闲下载任务执行器
LinkedListNode<ITaskAgent<WebRequestTask>> agentNode = m_WorkingAgents.AddLast(agent); // 加入执行器列表中
StartTaskStatus status = agent.Start(task); // 用执行器下载任务
}
}
}