uniyt http 异步获取数据

1 篇文章 0 订阅

HttpAsyn**重点内容**
下载采用协同,固定更新 每次从下载队列中取一个下载包
下载完成 通过下载包回调通知数据关心者

HttpPackage**重点内容**
下载包 包含 回调 方法,http请求url

对下载的数据 用jeson 解析,通过定义对应的数据对象,用JsonMapper 取转换,注意定义的数据对象一定要和jeson内容对应

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;
using System;
/// <summary>
/// 加载数据包
/// </summary>
public class HttpPackage
{
    /// <summary>
    /// 下载地址
    /// </summary>
    public string url;
    /// <summary>
    /// 下载完成
    /// </summary>
    public Action<string> Downloaded;

    public HttpPackage( string url, Action< string> callBack)
    {  
        this.url = url;
        Downloaded = callBack;
    }

}

public class HttpAsyn : MonoBehaviour {
    public static HttpAsyn Instance;

    private int coroutineCount;
    private int limitCoroutineCount=5;
    private Queue<HttpPackage> listPackage = new Queue<HttpPackage>();
    private void Awake()
    {
        Instance = this;
    }

    /// <summary>
    /// 进入下载队列
    /// </summary>
    /// <param name="package"></param>
    public void EnterLoadingQueue(HttpPackage package)
    {
        if (!listPackage.Contains(package))
        {
            listPackage.Enqueue(package);
        } 
    }
    /// <summary>
    ///  进入下载队列
    /// </summary>
    /// <param name="package">数组</param>
    public void EnterLoadingQueue(HttpPackage[] package)
    {
        for (int i = 0; i < package.Length; i++)
        {
            if (listPackage.Contains(package[i]))
            {
                continue;
            }
            listPackage.Enqueue(package[i]);
        }
    }

    /// <summary>
    /// 下载数据
    /// </summary>
    public void OnUpdate()
    {
        if (listPackage.Count>0&&coroutineCount<limitCoroutineCount)
        {
            HttpPackage package = listPackage.Dequeue();
            try
            {
                StartCoroutine(AsynLoadingData(package));
            }
            catch (System.Exception ex)
            {

            }
        }
    }
    /// <summary>
    /// 异步下载数据
    /// </summary>
    /// <param name="package"></param>
    /// <returns></returns>
    public IEnumerator AsynLoadingData(HttpPackage package)
    {
        coroutineCount += 1;
        using (WWW www=new WWW(package.url))
        {
            yield return www;
            if (www.error!=null)
            {
                Debug.LogError(this.name + ".AsynLoadingData()下载失败" + "url:" + package.url);
                EnterLoadingQueue(package);

            }
            else
            {
               if (package.Downloaded!=null)
               {
                    if (string.IsNullOrEmpty(www.text) )
                    {
                        Debug.LogError(this.name + ".AsynLoadingData() 获取的 www.text 为空 ");
                    }
                    else
                    {
                        package.Downloaded(www.text);
                    }              
               }
            }
            coroutineCount -= 1;
        }            
    }

    public void OnRemovePackage()
    {
        if(HttpAsyn.Instance!=null)
        {
            StopAllCoroutines();
            listPackage.Clear();
            coroutineCount = 0;

        }

    }

    private void Update()
    {
        OnUpdate();
    }
}


public class AnalysisJson
{
    public static T  Analy<T>(string text) where T:class
    {
        T o = JsonMapper.ToObject<T>(text);

        if (o!=null)
        {
            return o ;
        }
        return default(T);
    }

    public static T GetData<T>(string text) where T : class
    {
        JsonData table = AnalysisJson.Analy<JsonData>(text);
        T t = JsonMapper.ToObject<T>(table["retBody"].ToJson());
        return t;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您可以使用 Unity 中的 JsonUtility 类来解析 JSON 数据。如果您要解析 JSON 数组,可以将其解析为包含多个对象的列表。以下是一个示例代码块,演示如何解析 JSON 数组: ```csharp using UnityEngine; using System.Collections.Generic; public class JsonParser : MonoBehaviour { public string json = "[{\"name\":\"John\", \"age\":30}, {\"name\":\"Jane\", \"age\":25}]"; [System.Serializable] public class Person { public string name; public int age; } [System.Serializable] public class PersonList { public List<Person> people; } void Start() { PersonList personList = new PersonList(); personList.people = new List<Person>(); string data = "{\"people\":" + json + "}"; JsonUtility.FromJsonOverwrite(data, personList); foreach (Person p in personList.people) { Debug.Log("Name: " + p.name + ", Age: " + p.age); } } } ``` 在这个例子中,我们定义了一个名为 Person 的类,表示 JSON 数组中的每个对象。我们还定义了一个名为 PersonList 的类,这个类包含一个 Person 类型的列表。在 Start() 方法中,我们将 JSON 数组存储在一个字符串变量中,并将其解析为 PersonList 对象。最后,我们遍历 PersonList 中的每个 Person 对象,并将其输出到 Unity 控制台中。 请注意,我们在字符串变量 data 中使用了一个额外的 JSON 对象来包装 PersonList 对象。这是因为 JsonUtility 类不能直接解析 JSON 数组,而只能解析包含一个对象的 JSON 字符串。因此,我们需要将 JSON 数组包装在一个对象中,以便 JsonUtility 可以解析它。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tianyongheng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值