AIR: сохранить расположение и размер приложения - PullRequest
1 голос
/ 25 февраля 2010

ОК. Я пытаюсь сделать так, чтобы, когда пользователь запускает мое эфирное приложение, оно позиционировало себя и масштабировалось так, как оно было в последний раз, когда оно открывалось.

Вот мой код:

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 Ответ

3 голосов
/ 25 февраля 2010

Полагаю, вы захотите изменить код сохранения 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 никогда не выполняется, поэтому файл остается открытым. Размещение вызова 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 таких вызовов нет.

...