【问题标题】:AIR: save application location and sizeAIR:保存应用程序位置和大小
【发布时间】:2010-02-25 15:37:49
【问题描述】:

好的,我正在努力做到这一点,以便当用户启动我的空中应用程序时,它会自行定位并调整自身大小,使其与上次打开时的大小一致。

这是我的代码:

private function init():void
{
    gotoLastPosition();
    this.nativeWindow.addEventListener( Event.CLOSING, saveAppPosition );
}

private function saveAppPosition(e:Event = null):void
{
    var xml:XML = new XML('<position x="'+this.nativeWindow.x+'" y="'+this.nativeWindow.y+'" width="'+this.width+'" height="'+this.height+'"/>');

    var f:File = File.applicationStorageDirectory.resolvePath("appPosition.xml");
    var s:FileStream = new FileStream();
    try
    {
        s.open(f,flash.filesystem.FileMode.WRITE);

        s.writeUTFBytes(xml.toXMLString());

        s.close();
    }
    catch(e:Error){}
}

private function gotoLastPosition():void
{
    var f:File = File.applicationStorageDirectory.resolvePath("appPosition.xml");   
    if(f.exists)
    {
        var s:FileStream = new FileStream();
        s.open(f,flash.filesystem.FileMode.READ);
        var xml:XML = XML(s.readUTFBytes(s.bytesAvailable));

        this.nativeWindow.x = xml.@x;
        this.nativeWindow.y = xml.@y;
        this.width = xml.@width;
        this.height = xml.@height;
    }
}

这确实有效,但是,我收到用户的抱怨,有时当他们启动应用程序时,找不到它的位置(屏幕外),他们可以右键单击任务栏项目并将其最大化以将其取回,但这不是必需的。

我只能假设这个问题是由我试图保存应用程序的位置引起的。我不知道可能出了什么问题,或者我该如何解决这个问题?

也许一种方法可以在定位后判断应用是否在屏幕外,如果是,则将其移动到屏幕上?不知道我该怎么做?

有什么想法吗?

谢谢!!!

【问题讨论】:

  • 这种情况是否只发生在用户拥有多台显示器的情况下,或者当他们使用笔记本电脑插入不同分辨率的不同投影仪时,或者在同一用户的单显示器情况下?
  • 我不确定,我不这么认为,1 位用户正在使用他的笔记本电脑并且正在度假,很确定它没有连接到投影仪。我现在想知道xml文件是否会以某种方式损坏。

标签: apache-flex air application-settings


【解决方案1】:

我相信您会想要更改您的 XML 保存代码:

try
{
    s.open(f,flash.filesystem.FileMode.WRITE);

    s.writeUTFBytes(xml.toXMLString());

    s.close();
}
catch(e:Error){}

try
{
    s.open(f,flash.filesystem.FileMode.WRITE);
    s.writeUTFBytes(xml.toXMLString());
} catch(e:Error) {
    logger.error( e );
} finally {
    s.close();
}

如果发生错误,您将永远看不到它,因为 catch 块只是忽略它。如果某些人发生错误,则永远不会写入流。此外,关闭调用也永远不会执行,因此文件保持打开状态。将 close() 调用放在 finally 块中将确保无论成功或失败,文件都会关闭。不能保证这是您的问题,但从理论上讲,这些是某些用户可能遇到的潜在陷阱。

您也可能想在阅读后关闭文件。

var s:FileStream = new FileStream();
try {
   s.open(f,flash.filesystem.FileMode.READ);
   var xml:XML = XML(s.readUTFBytes(s.bytesAvailable));
   ...
} finally {
   s.close();
}

它可能无法在退出时保存窗口位置,因为它无法打开文件进行写入,因为它仍然可以读取。

我还建议开始将这些错误写入日志文件,以查看错误是否是罪魁祸首。 AIR 有一个非常好的日志系统,您可以使用它与 log4j 非常相似。当人们遇到麻烦时,您可以让他们向您发送该日志文件,并就他们的程序中发生的情况获得更好的反馈。必须登录任何严肃的应用程序。

更不用说您可以使用 XPanelOnAIR 之类的应用程序在调试过程中获取日志消息。比 trace() 要好得多。

http://www.novio.be/blog/?p=920

http://livedocs.adobe.com/flex/3/html/help.html?content=logging_09.html

删除了对 flush() 的引用,因为 AIR 没有这些调用。

【讨论】:

  • +1 不确定这是否是我的问题的解决方案(但),但很好地解释了如何更好地处理文件流。
  • FileStream 似乎没有方法 flush() 吗?你的意思是 truncate() 吗?
  • 我的 API 搞混了。 AIR 没有 flush() 方法。您绝对不想使用会破坏文件内容的 truncate()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 2011-08-24
  • 2010-09-10
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
相关资源
最近更新 更多