读取多个XML文件会冻结应用程序

时间:2014-07-11 18:33:03

标签: c#

我试图为一款名为Eve Online的游戏编写一个应用程序,人们在那里挖掘行星的产品。该应用程序基本上是为我训练,并且应该告诉人们他们的操作何时到期,以便他们可以重置。一些玩家有30个角色,有120个行星和200多个定时操作。

我已编写代码将字符存储在SQLite db中,然后我将每个字符拉2个验证码并返回其设备。此信息存储在2个单独的XML文档中。一个是行星,另一个是行星上的设备。我试图通过以下方式解决所有问题:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;

namespace PITimer
{
class GetPlanets
{
    private long KeyID, CharacterID;
    private string VCode;
    string CharName;
    public List<long> planets = new List<long>();
    public List<string> planetNames = new List<string>();
    public List<AllInfo> allInfo = new List<AllInfo>();

    public GetPlanets(long KeyID, long CharacterID, string VCode, string CharName)
    {
        this.KeyID = KeyID;
        this.CharacterID = CharacterID;
        this.VCode = VCode;
        this.CharName = CharName;
    }

    public async Task PullPlanets()
    {
        XmlReader lesern = XmlReader.Create("https://api.eveonline.com/char/PlanetaryColonies.xml.aspx?keyID=" + KeyID + "&vCode=" + VCode + "&characterID=" + CharacterID);

        while (lesern.Read())
        {
            long planet = 000000;
            string planetName;
            planet = Convert.ToInt64(lesern.GetAttribute("planetID"));
            planetName = lesern.GetAttribute("planetName");

            if ((planet != 000000) && (planetName != null))
            {
                planets.Add(planet);
                planetNames.Add(planetName);
                await GetExpirationTimes(planet, planetName);

            }
        }
    }



    public async Task GetExpirationTimes(long planetID, string planetName)
    {
        string planet = planetID.ToString();
        XmlReader lesern = XmlReader.Create("https://api.eveonline.com/char/PlanetaryPins.xml.aspx?keyID=" + KeyID + "&vCode=" + VCode + "&characterID=" + CharacterID + "&planetID=" + planet);


        while (lesern.Read())
        {
            string expTime;
            expTime = lesern.GetAttribute("expiryTime");

            if ((expTime != null) && (expTime != "0001-01-01 00:00:00"))
            {
                allInfo.Add(new AllInfo(CharName, planetName, Convert.ToDateTime(expTime)));

            }
        }
    }


    public List<long> ReturnPlanets()
    {
        PullPlanets();
        return planets;
    }

    public List<string> ReturnNames()
    {
        return planetNames;
    }

    public List<AllInfo> ReturnAllInfo()
    {
        return allInfo;
    }

}

}

这确实有效,它会返回数据,我在Xamarin Android上遇到了ListView。我的问题是它在运行时会冻结系统。我正在测试2个字符,UI有时会被冻结几秒钟。其他时候它运行良好。但是有30个字符我会遇到麻烦。

我已尝试在我能够想象的每个配置中使用异步和任务解决此问题。它仍然很慢或根本不工作。如何以适用于应用程序的方式进行设置?

它还在背景服务中运行较轻的检查,但是我担心我会使系统紧张。

这里可以看到行星XML:https://api.eveonline.com/char/PlanetaryColonies.xml.aspx?keyID=3060230&vCode=1ft0nDTRaXgVM6r0co9QhJUq3tC5hYErfBFrt7Skilk4181krBiIRVhshH1TzkDP&characterID=94304895

我拉行星ID并从该运行中获取此XML:

https://api.eveonline.com/char//PlanetaryPins.xml.aspx?keyID=3060230&vCode=1ft0nDTRaXgVM6r0co9QhJUq3tC5hYErfBFrt7Skilk4181krBiIRVhshH1TzkDP&characterID=94304895&planetID=40175117

我之前使用过XMLDoc,但是想到读者会更好更快。

0 个答案:

没有答案