19.Web请求-WebRequest

GameFramework中的WebRequest

类图

WebRequestComponent
入口
WebRequestManager
下载管理器
TaskPool<WebRequestTask>
下载任务池,对任务进行调度
一开始会初始化固定数量的任务执行器
WebRequestTask
下载任务,封装任务数据
ITaskAgent<WebRequestTask>
下载任务执行器接口
用来执行 WebRequestTask
WebRequestAgent
下载任务执行器
用来执行 WebRequestTask
把执行功能委托给 WebRequestAgentHelperBase
WebRequestAgentHelperBase
下载器基类
UnityWebRequestAgentHelper
UnityWebRequest实现的下载器
具体功能委托给 UnityWebRequest
YourWebRequestAgentHelper
有需要可以实现你自己的下载器

使用

先在 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); //  用执行器下载任务
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/qmladm/article/details/130040832