1

我们已经为新发布的软件产品发布了一个基本的 iOS 应用程序(使用 FB 4.6 使用 Adob​​e Flex/AIR 构建),我的任务是对应用程序进行增强,从本质上使其功能更加符合要求。

我做了很多改进,一路上取得了不同程度的成功。但是,我离题了。

我发现应用程序中似乎存在严重的内存泄漏,直到现在才被发现。

该应用程序的初始版本并没有做很多事情,但对于大多数用途来说已经足够了。但是现在它包含了更多的功能,我在测试中注意到它在 iPad 上有点迟钝。我将其归结为设备问题,并猜测第一代 iPad 不如新 iPad 强大。

我们在同事的 iPad 3 上测试了该应用程序,发现了同样的速度问题。我通过 FB 的分析器运行该应用程序,发现它似乎使用了非常多的内存。当然,这个应用程序是针对移动平台的,并且分析器在 Windows 的 Flash Player 中运行该应用程序,但我认为这是问题所在。

应用程序中出现的第一个视图只是一个登录屏幕。我在应用程序启动时查看了图表,内存使用率一直很低,然后突然飙升至 120MB。这是没有用户输入的。登录或切换视图会使使用量翻倍,甚至三倍,而且永远不会下降。

我承认,也许我没有像我应该意识到的那样意识到资源使用,但我一直在尝试清除对象,比如我去的。

大多数后端功能是通过调用用 ASP.NET 编写的 Web 服务来完成的。使用 Web 服务向导将 Web 服务插入 Flash Builder...例如,URL 将是http://www.mydomain.com/MyWebService.asmx?WSDL

第一个“主页”视图不会调用任何 Web 服务功能,除非用户实际执行了某些操作,例如按下按钮。我从视图的“fx:Declarations”部分取出 Web 服务声明,并注释掉对它的所有引用,然后再次尝试分析器。

这一次,使用量上限为 2MB。这是一个天文数字的差异。

分析器显示 99% 的内存被“XML”类使用,这让我相信 Web 服务是问题所在。似乎视图在启动时正在查询 Web 服务,并且为此使用了大量内存。

我在这里错过了什么吗?有没有更有效的方法从 AIR 应用程序调用 Web 服务?我究竟做错了什么?

提前致谢!

4

1 回答 1

1

我想我终于想通了!!

这篇文章是为可能遇到相同问题的其他人提供的公共服务。

我不确定为什么 Web 服务会导致这样的内存使用高峰,但我能够解决它。在我的情况下,使用量仍然飙升至略低于 120MB,但不同的是,当我切换视图时,它不会像以前那样翻倍/翻倍。

感谢艾米带领我朝着正确的方向前进。我基本上把所有的声明等都取出来了,然后在应用程序 MXML 文件中公开声明,就像这样。

public var ws:WebService = new WebService();

protected function viewnavigatorapplication1_preinitializeHandler(event:FlexEvent):void
{
    ws.loadWSDL("http://www.mydomain.com/MyWebService.asmx?WSDL");
}

那么在你看来...

private var serviceOperation:AbstractOperation;
private var myToken:AsyncToken;

private function getData():void
{
    var firstName:String = "John";
    var lastName:String = "Smith";        

    serviceOperation = this.parentApplication.ws.getOperation("MyFunction");
    serviceOperation.addEventListener(FaultEvent.FAULT, fault);
    serviceOperation.addEventListener(ResultEvent.RESULT, result);

    myToken = serviceOperation.send(firstName, lastName);
}

public function result(data:Object):void
{
    switch(data.token)
    {
        case myToken:
            processResults(data);
            break;
        default:
            break;
    }
}

显然,当您完成它们时,请确保移除事件侦听器并将您的对象引用设置为 null。为了安全起见,我这样做是为了令牌和操作。

我还没有彻底测试应用程序的内存使用情况,但乍一看,它并没有呈指数级增长,而且我相信我什至看到它在垃圾收集开始时下降了。

于 2013-04-03T22:31:17.240 回答