Domanda

OK, sto cercando di fare in modo che quando un utente avvia la mia app Air, si posizioni e si ridimensioni in base a ciò che era l'ultima volta che è stata aperta.

Ecco il mio codice:

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;
    }
}

Funziona, tuttavia, ricevo lamentele da parte degli utenti che a volte quando avviano l'app, non è dove si trova (fuori dallo schermo), possono fare clic con il pulsante destro del mouse sull'elemento della barra delle applicazioni e massimizzarlo per ripristinarlo, ma dovrebbe non essere necessario.

Posso solo supporre che questo problema sia causato dal mio tentativo di salvare la posizione dell'applicazione.Non so cosa potrebbe essere andato storto o come posso risolverlo?

Forse un modo per sapere se l'app è fuori schermo dopo averla posizionata e, in caso affermativo, spostarla sullo schermo?Non so come posso farlo però?

Qualche idea?

Grazie!!!

È stato utile?

Soluzione

Credo che vorrai cambiare il tuo codice di salvataggio XML da:

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

    s.writeUTFBytes(xml.toXMLString());

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

A

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

Se si verifica un errore non lo vedrai mai poiché il blocco catch lo ignora.Se si verifica un errore per alcune persone, lo stream non verrà mai scritto.Inoltre la chiamata di chiusura non viene mai eseguita, quindi il file rimane aperto.L'inserimento della chiamata close() nel blocco final garantirà, indipendentemente dal successo o dal fallimento, che il file verrà chiuso.Non è una garanzia che questo sia il tuo problema, ma queste sono, in teoria, potenziali insidie ​​​​che alcuni utenti potrebbero incontrare.

Inoltre potresti voler chiudere il file anche dopo averlo letto.

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

È possibile che non riesca a salvare la posizione della finestra all'uscita perché non può aprire il file in scrittura perché è ancora aperto anche in lettura.

Consiglierei anche di iniziare a scrivere questi errori in un file di registro per vedere se un errore potrebbe essere il colpevole.AIR ha un sistema di registrazione piuttosto carino che puoi usare in modo molto simile a log4j.Quando le persone hanno problemi puoi semplicemente convincerle a inviarti quel file di registro e ottenere un feedback migliore su cosa sta succedendo nel loro programma per la loro situazione.L'accesso a qualsiasi applicazione seria è obbligatorio.

Per non parlare della possibilità di utilizzare applicazioni come XPanelOnAIR per ricevere messaggi di registrazione man mano che si verificano durante il debug.Molto molto molto meglio di trace().

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

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

Rimossi i riferimenti a flush() poiché AIR non dispone di tali chiamate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top