2010-02-25 46 views
1

好的我試圖做到這一點,當用戶啓動我的空氣應用程序時,它會自行定位並將其大小設置爲上次打開時的大小。AIR:保存應用程序的位置和大小

這裏是我的代碼:

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 = [email protected]; 
     this.nativeWindow.y = [email protected]; 
     this.width = [email protected]; 
     this.height = [email protected]; 
    } 
} 

這並不工作,但我從用戶的抱怨,有時當他們啓動應用程序,它是沒有被發現(關閉屏幕),他們可以在那裏右鍵單擊任務欄項並最大化它以恢復它,但這不應該是必需的。

我只能假設這個問題是由於我試圖保存應用程序的位置。我不知道可能會出現什麼問題,或者我該如何解決這個問題?

也許有一種方法可以告訴應用程序在定位後是否離開屏幕,如果是這樣,它會在屏幕上移動嗎?不知道我該如何做到這一點?

任何想法?

謝謝!

+0

僅當用戶有多個顯示器,或者他們使用插入不同分辨率的不同投影機的筆記本電腦時,或者在同一用戶的單顯示器情況下,這種情況纔會發生? – Robusto 2010-02-25 15:50:12

+0

我不確定,我不這麼認爲,1位用戶正在使用他的筆記本電腦,並且在度假時,很確定它沒有連接到投影機。我想知道現在是否可能xml文件以某種方式被損壞。 – 2010-02-25 16:00:46

回答

3

我相信你想改變你的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

刪除引用刷新()由於空氣不具有這些電話。

+0

+1不知道這是否是我的問題的解決方案(但),但很好的解釋如何更好地處理文件流。 – 2010-02-25 18:42:11

+0

FileStream似乎沒有flush()方法嗎?你可能意思是truncate()? – 2010-02-25 21:46:35

+0

我把我的API混淆了。 AIR沒有flush()方法。你絕對不希望使用會截斷文件內容的truncate()。 – chubbsondubs 2010-02-25 22:09:55

相關問題