2013-01-15 18 views
0

我有一個Adobe AIR桌面留言板應用程序內置在Flash CS5中,它加載外部名爲「.txt」文件中的一個動態文本字段,並檢查了每2分鐘創建一個新文件。我需要它通知用戶(NotificationType.CRITICAL)只有當文件是新的,而不是每次加載它時。可能嗎?NotificationType.CRITICAL只需要只火時加載的文件是一個新的文件

應用中的全部代碼:

NativeApplication.nativeApplication.startAtLogin=true 

stage.nativeWindow.alwaysInFront=true; 

//external text file load and recheck every 2 minutes 

var myInterval:uint = setInterval (loadUrl, 120000); 
var loader:URLLoader = new URLLoader(new URLRequest("https://my_text_file.txt")); 
loader.addEventListener(Event.COMPLETE, completeHandler); 

function completeHandler(event:Event):void { 
    var loadedText:URLLoader = URLLoader(event.target); 
if(myText_txt.htmlText!=loadedText.data){ 
    myText_txt.htmlText = loadedText.data; 
    stage.nativeWindow.notifyUser(NotificationType.CRITICAL) 
}else { 
    //do nothing 
    } 
} 

function loadUrl():void { 
    loader = new URLLoader(new URLRequest("https:///my_text_file.txt")); 
loader.addEventListener(Event.COMPLETE, completeHandler); 
} 

// button control 


Minimize_BTN.addEventListener(MouseEvent.CLICK, minimize); 
function minimize(e:MouseEvent){ 
stage.nativeWindow.minimize(); 

} 

drag_BTN.addEventListener(MouseEvent.MOUSE_DOWN, drag); 
function drag(e:MouseEvent){ 
stage.nativeWindow.startMove(); 

} 

stop(); //Stop on the frame you want 
+0

您仍然必須存儲舊的txt值。 –

回答

0

如果myText_txt字段正在修改加載的文本(例如,如果myText_txt的condenseWhite屬性設置爲true),則您的代碼可能無法正常工作。以確定文本已更改將其存儲在一個名爲字符串變量,例如,oldText,然後比較oldText與新加載的文字更準確的方法。

這是您的代碼的一部分重新編寫,包括oldText變量。此代碼也更高效,因爲它僅實例化一些變量並避免重複某些代碼:

import flash.net.URLRequest; 

function completeHandler(event:Event):void 
{ 
    var newText:String = loader.data; 
    if(newText != oldText) 
    { 
      myText_txt.htmlText = newText; 
      stage.nativeWindow.notifyUser(NotificationType.CRITICAL); 
      oldText = newText; 
    } 
} 

function loadUrl():void 
{ 
    loader.load(req); 
} 

// Initialize your variables and event handlers only one time 
var req:URLRequest = new URLRequest("https:///my_text_file.txt"); 

// Set cacheResponse to false to prevent a successful response 
// from being cached. 
req.cacheResponse = false; 

// And don't bother checking the cache, either. 
// Not necessary, but the request will execute a little faster. 
req.useCache = false; 

var loader:URLLoader = new URLLoader(); 
loader.addEventListener(Event.COMPLETE, completeHandler); 

// Use oldText inside completeHandler() to determine 
// whether the file's text has changed 
var oldText:String = ""; 

var myInterval:uint = setInterval(loadUrl, 120000); 

// Start loading the text right away 
loadUrl(); 
+0

像夢一樣工作!謝謝,這解決了這個問題100% –

+0

快速問題:)這個文件是否只在其新的時候才被下載? –

+0

對不起,我應該在我第一次發佈該示例時將其添加到代碼中。 URLRequest類具有名爲「cacheResponse」的布爾屬性,默認設置爲true。當您將此屬性設置爲false時,AIR會在每次發出新的服務器請求時下載文件。我已更新代碼以包含URLRequest實例的此設置。 –

0

你爲什麼不使用FileReference對象,以瞭解像modificationDate一些性質和在此基礎上驗證,如果文件是不同的,你還可以測試它的大小。

+0

這將是一個更有效的方式,但我不認爲,如果該文件正在從網絡服務器,這似乎是在示例代碼的情況下加載的是可能的。 –

+1

爲真 - 但如果它來自服務器,則根據服務器的可訪問性,可以添加一個功能,例如如果有問題的文件被修改,可以檢查並從閃存你會調用這個文件的PHP文件(例如,在它是PHP,但可以是任何SSI腳本),如果該文件的正負載新版本。 –

+0

是,採用中間件將是最有效的方法 - 你可以在服務器或者推送通知或推每當文件已被更新的實際文件。幾種可能性... –