【问题标题】:NotificationType.CRITICAL needs only to only fire when file loaded is a new fileNotificationType.CRITICAL 仅在加载的文件是新文件时才需要触发
【发布时间】:2013-01-15 21:19:34
【问题描述】:

我有一个内置于 Flash cs5 中的 Adob​​e Air 桌面留言板应用程序,它在动态文本字段中加载一个外部“.txt”文件,并每 2 分钟检查一次新文件。仅当文件是新文件时,我才需要它以 (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

【问题讨论】:

  • 您仍然需要存储旧的 txt 值。

标签: actionscript-3 air flash-cs5


【解决方案1】:

如果 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();

【讨论】:

  • 关于这个的快速问题 :) 文件是否也仅在新文件时才下载?
  • 抱歉,我应该在第一次发布示例时将其添加到代码中。 URLRequest 类有一个名为“cacheResponse”的布尔属性,默认设置为 true。当您将此属性设置为 false 时,AIR 将在每次发出新的服务器请求时下载文件。我已更新代码以包含 URLRequest 实例的此设置。
  • 忘记添加“req.useCache = false;”行代码。它现在也在他们里面。
  • 好的,我想我明白了。所以你现在的设置是:如果文件是新的,它将是 NotificationType.CRITICAL。如果不是什么都不做。如果文件是新的,它也会下载到动态文本字段。如果文件“不是”新的,它将不会下载任何内容。对吗?
  • 文件将始终被下载,但文本字段不会更新,除非最新文件中的文本与当前显示的文本不同。为了防止整个文件被下载,您需要一些服务器端脚本。
【解决方案2】:

您为什么不使用FileReference 对象来查找一些属性,例如modificationDate,并基于此验证文件是否不同,您还可以测试它的大小。

【讨论】:

  • 这将是一种更有效的方法,但我认为如果文件是从 Web 服务器加载的,那么这是不可能的,示例代码中似乎就是这种情况。
  • true - 但如果它来自服务器,则取决于服务器的可访问性,可以添加一个功能,例如PHP 文件可以检查有问题的文件是否被修改,您可以从 flash 中调用此文件(例如,它是 PHP,但可以是任何 SSI 脚本)以及是否正加载该文件的新版本。
  • 是的,使用中间件将是最有效的方法——您可以让服务器推送通知或在文件更新时推送实际文件。几种可能性...
猜你喜欢
  • 2012-12-29
  • 2014-05-12
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多