Flash AS3,如何仅显示动态文本的最后一行(以及更多)?

Flash AS3,如何仅显示动态文本的最后一行(以及更多)?,flash,actionscript-3,Flash,Actionscript 3,我制作了一个actionscript,加载一个外部文本文件,并将其内容滚动到底部: var myTextLoader:URLLoader = new URLLoader(); myTextLoader.addEventListener(Event.COMPLETE, onLoaded); function onLoaded(e:Event):void { track_info.text = e.target.data; addChild(track_info); addEventList

我制作了一个actionscript,加载一个外部文本文件,并将其内容滚动到底部:

var myTextLoader:URLLoader = new URLLoader();
myTextLoader.addEventListener(Event.COMPLETE, onLoaded);

function onLoaded(e:Event):void {
track_info.text = e.target.data;

addChild(track_info);
  addEventListener(Event.ENTER_FRAME, scrollField);
}

function scrollField(e:Event):void {
 if(track_info.scrollV < track_info.maxScrollV) {
    track_info.scrollV++;
  }else{
removeEventListener(Event.ENTER_FRAME, scrollField);
  }
}

myTextLoader.load(new URLRequest("tracks.txt"));
脚本工作正常,但我想知道这个问题是否可以解决:

  • 我想在flash电影中只显示当前歌曲,列表的最后一行(正在播放的那一行),而不是tracks.txt文件中的所有数据。能做到吗

  • 为此,电影必须几乎实时地自动更新.txt中的内容,以将新歌曲信息显示到文本字段中,取代以前的内容。有没有办法做到这一点

  • 最后,是否可以在文本字段中隐藏“[Day-Month-Year-Hour:Min:Sec]*”25个字符的前缀,以便在flash电影中仅显示艺术家-歌曲名称部分

  • 提前感谢你的帮助

    编辑

    var reload:Timer = new Timer(5000, 0); 
    reload.addEventListener(TimerEvent.TIMER, onTimer); 
    function onTimer(event:TimerEvent):void{ 
        var myTextLoader:URLLoader = new URLLoader(); 
        myTextLoader.addEventListener(Event.COMPLETE, onLoaded); 
        function onLoaded(e:Event):void {
            var lines:Array = e.target.data.split("\n"); 
            var lastLine:String = lines[lines.length - 1]; 
            var artistAndSong:String = lastLine.substr(24); 
            track_info.text = artistAndSong; 
            addChild(track_info); 
            myTextLoader.load(new URLRequest("tracks.txt")); 
        } 
        reload.start(); 
    }
    
    var reload:Timer = new Timer(5000, 1); 
    reload.addEventListener(TimerEvent.TIMER, onTimer); 
    
    var tracksLoader:URLLoader = new URLLoader();
    tracksLoader.addEventListener(Event.COMPLETE,onTracksLoaded);
    tracksLoader.addEventListener(IOErrorEvent.IO_ERROR,onTracksError);
    tracksLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onTracksError);
    
    loadTracks();
    
    function onTracksLoaded(e:Event):void {
        trace("onTracksLoaded");
        parseTracks(tracksLoader.data); 
        reload.start(); 
    }
    
    function onTimer(event:TimerEvent):void{ 
        loadTracks();
    }
    
    function onTracksError(e:Event):void {
        trace("onTracksError", e);
        reload.start();
    }
    
    function loadTracks():void {
        tracksLoader.load(new URLRequest("127.0.0.1,55684.log")); 
    }
    
    function parseTracks(data:String):void {
        try {
            debugChars(data); 
            var lines:Array = data.split("\r\n"); 
            var lastLine:String = lines[lines.length - 1]; 
            var artistAndSong:String = lastLine.substr(24).split(" - ").join("\n");
            trace(artistAndSong);
            track_info.text = artistAndSong; 
            addChild(track_info);
        } catch(e:Error) {
    
        }
    }
    
    function debugChars(str:String):void {
        var buffer:ByteArray = new ByteArray();
        buffer.writeUTFBytes(str);
        buffer.position = 0;
        var result:String = "";
        while(buffer.bytesAvailable) {
            result += "0x" + uint(buffer.readUnsignedByte()).toString(16) + ", ";
            if(buffer.position % 16 == 0) {
                result += "\n";
            }
    
        }
        //  print this string...
        trace(result);
    }
    
    编辑

    var reload:Timer = new Timer(5000, 0); 
    reload.addEventListener(TimerEvent.TIMER, onTimer); 
    function onTimer(event:TimerEvent):void{ 
        var myTextLoader:URLLoader = new URLLoader(); 
        myTextLoader.addEventListener(Event.COMPLETE, onLoaded); 
        function onLoaded(e:Event):void {
            var lines:Array = e.target.data.split("\n"); 
            var lastLine:String = lines[lines.length - 1]; 
            var artistAndSong:String = lastLine.substr(24); 
            track_info.text = artistAndSong; 
            addChild(track_info); 
            myTextLoader.load(new URLRequest("tracks.txt")); 
        } 
        reload.start(); 
    }
    
    var reload:Timer = new Timer(5000, 1); 
    reload.addEventListener(TimerEvent.TIMER, onTimer); 
    
    var tracksLoader:URLLoader = new URLLoader();
    tracksLoader.addEventListener(Event.COMPLETE,onTracksLoaded);
    tracksLoader.addEventListener(IOErrorEvent.IO_ERROR,onTracksError);
    tracksLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onTracksError);
    
    loadTracks();
    
    function onTracksLoaded(e:Event):void {
        trace("onTracksLoaded");
        parseTracks(tracksLoader.data); 
        reload.start(); 
    }
    
    function onTimer(event:TimerEvent):void{ 
        loadTracks();
    }
    
    function onTracksError(e:Event):void {
        trace("onTracksError", e);
        reload.start();
    }
    
    function loadTracks():void {
        tracksLoader.load(new URLRequest("127.0.0.1,55684.log")); 
    }
    
    function parseTracks(data:String):void {
        try {
            debugChars(data); 
            var lines:Array = data.split("\r\n"); 
            var lastLine:String = lines[lines.length - 1]; 
            var artistAndSong:String = lastLine.substr(24).split(" - ").join("\n");
            trace(artistAndSong);
            track_info.text = artistAndSong; 
            addChild(track_info);
        } catch(e:Error) {
    
        }
    }
    
    function debugChars(str:String):void {
        var buffer:ByteArray = new ByteArray();
        buffer.writeUTFBytes(str);
        buffer.position = 0;
        var result:String = "";
        while(buffer.bytesAvailable) {
            result += "0x" + uint(buffer.readUnsignedByte()).toString(16) + ", ";
            if(buffer.position % 16 == 0) {
                result += "\n";
            }
    
        }
        //  print this string...
        trace(result);
    }
    
    可能split()与real.log文件不兼容。将显示所有文本,而不仅仅是最后一行。以下是.log示例:

    [30-07-2010 03:21:34] Log file created for client "127.0.0.1,55684".
    [30-07-2010 03:21:34] Client "127.0.0.1,55684" connected and has been identified as Traktor (or a something close enough).
    [30-07-2010 03:22:58] * The Bravery - An Honest Mistake
    [30-07-2010 03:23:22] * The Waterboys - The Whole of the Moon
    
    编辑

    var reload:Timer = new Timer(5000, 0); 
    reload.addEventListener(TimerEvent.TIMER, onTimer); 
    function onTimer(event:TimerEvent):void{ 
        var myTextLoader:URLLoader = new URLLoader(); 
        myTextLoader.addEventListener(Event.COMPLETE, onLoaded); 
        function onLoaded(e:Event):void {
            var lines:Array = e.target.data.split("\n"); 
            var lastLine:String = lines[lines.length - 1]; 
            var artistAndSong:String = lastLine.substr(24); 
            track_info.text = artistAndSong; 
            addChild(track_info); 
            myTextLoader.load(new URLRequest("tracks.txt")); 
        } 
        reload.start(); 
    }
    
    var reload:Timer = new Timer(5000, 1); 
    reload.addEventListener(TimerEvent.TIMER, onTimer); 
    
    var tracksLoader:URLLoader = new URLLoader();
    tracksLoader.addEventListener(Event.COMPLETE,onTracksLoaded);
    tracksLoader.addEventListener(IOErrorEvent.IO_ERROR,onTracksError);
    tracksLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onTracksError);
    
    loadTracks();
    
    function onTracksLoaded(e:Event):void {
        trace("onTracksLoaded");
        parseTracks(tracksLoader.data); 
        reload.start(); 
    }
    
    function onTimer(event:TimerEvent):void{ 
        loadTracks();
    }
    
    function onTracksError(e:Event):void {
        trace("onTracksError", e);
        reload.start();
    }
    
    function loadTracks():void {
        tracksLoader.load(new URLRequest("127.0.0.1,55684.log")); 
    }
    
    function parseTracks(data:String):void {
        try {
            debugChars(data); 
            var lines:Array = data.split("\r\n"); 
            var lastLine:String = lines[lines.length - 1]; 
            var artistAndSong:String = lastLine.substr(24).split(" - ").join("\n");
            trace(artistAndSong);
            track_info.text = artistAndSong; 
            addChild(track_info);
        } catch(e:Error) {
    
        }
    }
    
    function debugChars(str:String):void {
        var buffer:ByteArray = new ByteArray();
        buffer.writeUTFBytes(str);
        buffer.position = 0;
        var result:String = "";
        while(buffer.bytesAvailable) {
            result += "0x" + uint(buffer.readUnsignedByte()).toString(16) + ", ";
            if(buffer.position % 16 == 0) {
                result += "\n";
            }
    
        }
        //  print this string...
        trace(result);
    }
    
    编辑

    var reload:Timer = new Timer(5000, 0); 
    reload.addEventListener(TimerEvent.TIMER, onTimer); 
    function onTimer(event:TimerEvent):void{ 
        var myTextLoader:URLLoader = new URLLoader(); 
        myTextLoader.addEventListener(Event.COMPLETE, onLoaded); 
        function onLoaded(e:Event):void {
            var lines:Array = e.target.data.split("\n"); 
            var lastLine:String = lines[lines.length - 1]; 
            var artistAndSong:String = lastLine.substr(24); 
            track_info.text = artistAndSong; 
            addChild(track_info); 
            myTextLoader.load(new URLRequest("tracks.txt")); 
        } 
        reload.start(); 
    }
    
    var reload:Timer = new Timer(5000, 1); 
    reload.addEventListener(TimerEvent.TIMER, onTimer); 
    
    var tracksLoader:URLLoader = new URLLoader();
    tracksLoader.addEventListener(Event.COMPLETE,onTracksLoaded);
    tracksLoader.addEventListener(IOErrorEvent.IO_ERROR,onTracksError);
    tracksLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onTracksError);
    
    loadTracks();
    
    function onTracksLoaded(e:Event):void {
        trace("onTracksLoaded");
        parseTracks(tracksLoader.data); 
        reload.start(); 
    }
    
    function onTimer(event:TimerEvent):void{ 
        loadTracks();
    }
    
    function onTracksError(e:Event):void {
        trace("onTracksError", e);
        reload.start();
    }
    
    function loadTracks():void {
        tracksLoader.load(new URLRequest("127.0.0.1,55684.log")); 
    }
    
    function parseTracks(data:String):void {
        try {
            debugChars(data); 
            var lines:Array = data.split("\r\n"); 
            var lastLine:String = lines[lines.length - 1]; 
            var artistAndSong:String = lastLine.substr(24).split(" - ").join("\n");
            trace(artistAndSong);
            track_info.text = artistAndSong; 
            addChild(track_info);
        } catch(e:Error) {
    
        }
    }
    
    function debugChars(str:String):void {
        var buffer:ByteArray = new ByteArray();
        buffer.writeUTFBytes(str);
        buffer.position = 0;
        var result:String = "";
        while(buffer.bytesAvailable) {
            result += "0x" + uint(buffer.readUnsignedByte()).toString(16) + ", ";
            if(buffer.position % 16 == 0) {
                result += "\n";
            }
    
        }
        //  print this string...
        trace(result);
    }
    
    请注意,“艺术家”和“歌曲名称”之间的换行是由以下代码引起的:

    .split(" - ").join("\n");
    
    实际上,.log附带了“艺术家-歌曲名”

    onTracksLoaded
    0x5b, 0x33, 0x30, 0x2d, 0x30, 0x37, 0x2d, 0x32, 0x30, 0x31, 0x30, 0x20, 0x30, 0x33, 0x3a, 0x32, 
    0x31, 0x3a, 0x33, 0x34, 0x5d, 0x20, 0x4c, 0x6f, 0x67, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x63, 
    0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 
    0x74, 0x20, 0x22, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x2c, 0x35, 0x35, 0x36, 
    0x38, 0x34, 0x22, 0x2e, 0xa, 0x5b, 0x33, 0x30, 0x2d, 0x30, 0x37, 0x2d, 0x32, 0x30, 0x31, 0x30, 
    0x20, 0x30, 0x33, 0x3a, 0x32, 0x31, 0x3a, 0x33, 0x34, 0x5d, 0x20, 0x43, 0x6c, 0x69, 0x65, 0x6e, 
    0x74, 0x20, 0x22, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x2c, 0x35, 0x35, 0x36, 
    0x38, 0x34, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x6e, 
    0x64, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 
    0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x54, 0x72, 0x61, 0x6b, 0x74, 0x6f, 0x72, 
    0x20, 0x28, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 
    0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x20, 0x65, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x29, 0x2e, 0xa, 
    0x5b, 0x33, 0x30, 0x2d, 0x30, 0x37, 0x2d, 0x32, 0x30, 0x31, 0x30, 0x20, 0x30, 0x33, 0x3a, 0x32, 
    0x32, 0x3a, 0x35, 0x38, 0x5d, 0x20, 0x2a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x42, 0x72, 0x61, 0x76, 
    0x65, 0x72, 0x79, 0x20, 0x2d, 0x20, 0x41, 0x6e, 0x20, 0x48, 0x6f, 0x6e, 0x65, 0x73, 0x74, 0x20, 
    0x4d, 0x69, 0x73, 0x74, 0x61, 0x6b, 0x65, 0xa, 0x5b, 0x33, 0x30, 0x2d, 0x30, 0x37, 0x2d, 0x32, 
    0x30, 0x31, 0x30, 0x20, 0x30, 0x33, 0x3a, 0x32, 0x33, 0x3a, 0x32, 0x32, 0x5d, 0x20, 0x2a, 0x20, 
    0x54, 0x68, 0x65, 0x20, 0x57, 0x61, 0x74, 0x65, 0x72, 0x62, 0x6f, 0x79, 0x73, 0x20, 0x2d, 0x20, 
    0x54, 0x68, 0x65, 0x20, 0x57, 0x68, 0x6f, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 
    0x20, 0x4d, 0x6f, 0x6f, 0x6e, 0xa, 0x5b, 0x33, 0x30, 0x2d, 0x30, 0x37, 0x2d, 0x32, 0x30, 0x31, 
    0x30, 0x20, 0x30, 0x33, 0x3a, 0x32, 0x37, 0x3a, 0x35, 0x36, 0x5d, 0x20, 0x2a, 0x20, 0x42, 0x61, 
    0x62, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x63, 0x6f, 0x73, 0x20, 0x2d, 0x20, 0x59, 0x65, 0x67, 0x75, 
    0x61, 0xa, 
    g file created for client "127.0.0.1,55684".
    [30-07-2010 03:21:34] Client "127.0.0.1,55684" connected and has been identified as Traktor (or a something close enough).
    [30-07-2010 03:22:58] * The Bravery
    An Honest Mistake
    [30-07-2010 03:23:22] * The Waterboys
    The Whole of the Moon
    [30-07-2010 03:27:56] * Babasonicos
    Yegua
    
    对于1)和3),我会这样做

    可能是这样的:

    /* 
    \n is the end of line character. Depending on the program that creates
    the text file, you might need to change it to \r\n or \r
    Note I'm not doing any error checking, you might want to add it...
    */
    var lines:Array = e.target.data.split("\n");
    var lastLine:String = lines[lines.length - 1];
    
    如果格式是固定的,您可以拆分“*”上的最后一行,甚至可以使用来获取艺术家和歌曲名称

    /*
    Again, I'm not checking for any errors
    */
    var songAndArtist:String = lastLine.split("*")[1];
    

    对于2),只需在合理的时间间隔轮询服务器。有几种方法可以做到这一点。一种可能是,每当加载文件时,启动一个;完成此计时器后,停止计时器并重新加载文件。你也可以用它来代替计时器

    编辑

    var reload:Timer = new Timer(5000, 0); 
    reload.addEventListener(TimerEvent.TIMER, onTimer); 
    function onTimer(event:TimerEvent):void{ 
        var myTextLoader:URLLoader = new URLLoader(); 
        myTextLoader.addEventListener(Event.COMPLETE, onLoaded); 
        function onLoaded(e:Event):void {
            var lines:Array = e.target.data.split("\n"); 
            var lastLine:String = lines[lines.length - 1]; 
            var artistAndSong:String = lastLine.substr(24); 
            track_info.text = artistAndSong; 
            addChild(track_info); 
            myTextLoader.load(new URLRequest("tracks.txt")); 
        } 
        reload.start(); 
    }
    
    var reload:Timer = new Timer(5000, 1); 
    reload.addEventListener(TimerEvent.TIMER, onTimer); 
    
    var tracksLoader:URLLoader = new URLLoader();
    tracksLoader.addEventListener(Event.COMPLETE,onTracksLoaded);
    tracksLoader.addEventListener(IOErrorEvent.IO_ERROR,onTracksError);
    tracksLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onTracksError);
    
    loadTracks();
    
    function onTracksLoaded(e:Event):void {
        trace("onTracksLoaded");
        parseTracks(tracksLoader.data); 
        reload.start(); 
    }
    
    function onTimer(event:TimerEvent):void{ 
        loadTracks();
    }
    
    function onTracksError(e:Event):void {
        trace("onTracksError", e);
        reload.start();
    }
    
    function loadTracks():void {
        tracksLoader.load(new URLRequest("127.0.0.1,55684.log")); 
    }
    
    function parseTracks(data:String):void {
        try {
            debugChars(data); 
            var lines:Array = data.split("\r\n"); 
            var lastLine:String = lines[lines.length - 1]; 
            var artistAndSong:String = lastLine.substr(24).split(" - ").join("\n");
            trace(artistAndSong);
            track_info.text = artistAndSong; 
            addChild(track_info);
        } catch(e:Error) {
    
        }
    }
    
    function debugChars(str:String):void {
        var buffer:ByteArray = new ByteArray();
        buffer.writeUTFBytes(str);
        buffer.position = 0;
        var result:String = "";
        while(buffer.bytesAvailable) {
            result += "0x" + uint(buffer.readUnsignedByte()).toString(16) + ", ";
            if(buffer.position % 16 == 0) {
                result += "\n";
            }
    
        }
        //  print this string...
        trace(result);
    }
    
    我不确定你发布的代码有什么问题,但是解析日志的部分对我来说很好。我重新设置了一点延迟,并在加载数据的过程中添加了错误检查

    代码有一个问题:在等待当前加载操作完成之前调用计时器。这可能会导致问题。您不需要同时进行两次下载,因此在尝试重新加载之前,您最好等待下载完成(成功与否)(您可能不希望尝试在出现错误时重新加载;或者将重试次数限制为2次、3次或类似的次数,但这取决于您)

    另外,请注意,我将计时器的重复计数更改为1,因此您不必停止它。这意味着它将运行一次,然后停止,直到您再次调用start)。我构造了一点代码,将其部分划分为不同的函数,这样更容易理解

    在parseTracks函数中,我将所有代码包装在一个try/catch中,该函数捕获几乎所有的错误。这是一种快速而肮脏的方式,因此我通常不推荐这种错误处理方式,但可以在这里完成这项工作

    var reload:Timer = new Timer(5000, 1); 
    reload.addEventListener(TimerEvent.TIMER, onTimer); 
    
    var tracksLoader:URLLoader = new URLLoader();
    tracksLoader.addEventListener(Event.COMPLETE,onTracksLoaded);
    tracksLoader.addEventListener(IOErrorEvent.IO_ERROR,onTracksError);
    tracksLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onTracksError);
    
    loadTracks();
    
    function onTracksLoaded(e:Event):void {
        trace("onTracksLoaded");
        parseTracks(tracksLoader.data); 
        reload.start(); 
    }
    
    function onTimer(event:TimerEvent):void{ 
        loadTracks();
    }
    
    function onTracksError(e:Event):void {
        trace("onTracksError", e);
        reload.start();
    }
    
    function loadTracks():void {
        tracksLoader.load(new URLRequest("tracks.txt")); 
    }
    
    function parseTracks(data:String):void {
        try {
            var lines:Array = data.split("\n"); 
            var lastLine:String = lines[lines.length - 1]; 
            var artistAndSong:String = lastLine.substr(24); 
            trace(artistAndSong);
        } catch(e:Error) {
    
        }
    }
    
    编辑2

    添加此函数并打印其结果,以尝试检测所涉及的字符是否存在问题。。。从parseTracks中调用它,如下所示:

    debugChars(data);
    
    
    function debugChars(str:String):void {
        var buffer:ByteArray = new ByteArray();
        buffer.writeUTFBytes(str);
        buffer.position = 0;
        var result:String = "";
        while(buffer.bytesAvailable) {
            result += "0x" + uint(buffer.readUnsignedByte()).toString(16) + ", ";
            if(buffer.position % 16 == 0) {
                result += "\n";
            }
    
        }
        //  print this string...
        trace(result);
    }
    
    对于1)和3),我会这样做

    可能是这样的:

    /* 
    \n is the end of line character. Depending on the program that creates
    the text file, you might need to change it to \r\n or \r
    Note I'm not doing any error checking, you might want to add it...
    */
    var lines:Array = e.target.data.split("\n");
    var lastLine:String = lines[lines.length - 1];
    
    如果格式是固定的,您可以拆分“*”上的最后一行,甚至可以使用来获取艺术家和歌曲名称

    /*
    Again, I'm not checking for any errors
    */
    var songAndArtist:String = lastLine.split("*")[1];
    

    对于2),只需在合理的时间间隔轮询服务器。有几种方法可以做到这一点。一种可能是,每当加载文件时,启动一个;完成此计时器后,停止计时器并重新加载文件。你也可以用它来代替计时器

    编辑

    var reload:Timer = new Timer(5000, 0); 
    reload.addEventListener(TimerEvent.TIMER, onTimer); 
    function onTimer(event:TimerEvent):void{ 
        var myTextLoader:URLLoader = new URLLoader(); 
        myTextLoader.addEventListener(Event.COMPLETE, onLoaded); 
        function onLoaded(e:Event):void {
            var lines:Array = e.target.data.split("\n"); 
            var lastLine:String = lines[lines.length - 1]; 
            var artistAndSong:String = lastLine.substr(24); 
            track_info.text = artistAndSong; 
            addChild(track_info); 
            myTextLoader.load(new URLRequest("tracks.txt")); 
        } 
        reload.start(); 
    }
    
    var reload:Timer = new Timer(5000, 1); 
    reload.addEventListener(TimerEvent.TIMER, onTimer); 
    
    var tracksLoader:URLLoader = new URLLoader();
    tracksLoader.addEventListener(Event.COMPLETE,onTracksLoaded);
    tracksLoader.addEventListener(IOErrorEvent.IO_ERROR,onTracksError);
    tracksLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onTracksError);
    
    loadTracks();
    
    function onTracksLoaded(e:Event):void {
        trace("onTracksLoaded");
        parseTracks(tracksLoader.data); 
        reload.start(); 
    }
    
    function onTimer(event:TimerEvent):void{ 
        loadTracks();
    }
    
    function onTracksError(e:Event):void {
        trace("onTracksError", e);
        reload.start();
    }
    
    function loadTracks():void {
        tracksLoader.load(new URLRequest("127.0.0.1,55684.log")); 
    }
    
    function parseTracks(data:String):void {
        try {
            debugChars(data); 
            var lines:Array = data.split("\r\n"); 
            var lastLine:String = lines[lines.length - 1]; 
            var artistAndSong:String = lastLine.substr(24).split(" - ").join("\n");
            trace(artistAndSong);
            track_info.text = artistAndSong; 
            addChild(track_info);
        } catch(e:Error) {
    
        }
    }
    
    function debugChars(str:String):void {
        var buffer:ByteArray = new ByteArray();
        buffer.writeUTFBytes(str);
        buffer.position = 0;
        var result:String = "";
        while(buffer.bytesAvailable) {
            result += "0x" + uint(buffer.readUnsignedByte()).toString(16) + ", ";
            if(buffer.position % 16 == 0) {
                result += "\n";
            }
    
        }
        //  print this string...
        trace(result);
    }
    
    我不确定你发布的代码有什么问题,但是解析日志的部分对我来说很好。我重新设置了一点延迟,并在加载数据的过程中添加了错误检查

    代码有一个问题:在等待当前加载操作完成之前调用计时器。这可能会导致问题。您不需要同时进行两次下载,因此在尝试重新加载之前,您最好等待下载完成(成功与否)(您可能不希望尝试在出现错误时重新加载;或者将重试次数限制为2次、3次或类似的次数,但这取决于您)

    另外,请注意,我将计时器的重复计数更改为1,因此您不必停止它。这意味着它将运行一次,然后停止,直到您再次调用start)。我构造了一点代码,将其部分划分为不同的函数,这样更容易理解

    在parseTracks函数中,我将所有代码包装在一个try/catch中,该函数捕获几乎所有的错误。这是一种快速而肮脏的方式,因此我通常不推荐这种错误处理方式,但可以在这里完成这项工作

    var reload:Timer = new Timer(5000, 1); 
    reload.addEventListener(TimerEvent.TIMER, onTimer); 
    
    var tracksLoader:URLLoader = new URLLoader();
    tracksLoader.addEventListener(Event.COMPLETE,onTracksLoaded);
    tracksLoader.addEventListener(IOErrorEvent.IO_ERROR,onTracksError);
    tracksLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onTracksError);
    
    loadTracks();
    
    function onTracksLoaded(e:Event):void {
        trace("onTracksLoaded");
        parseTracks(tracksLoader.data); 
        reload.start(); 
    }
    
    function onTimer(event:TimerEvent):void{ 
        loadTracks();
    }
    
    function onTracksError(e:Event):void {
        trace("onTracksError", e);
        reload.start();
    }
    
    function loadTracks():void {
        tracksLoader.load(new URLRequest("tracks.txt")); 
    }
    
    function parseTracks(data:String):void {
        try {
            var lines:Array = data.split("\n"); 
            var lastLine:String = lines[lines.length - 1]; 
            var artistAndSong:String = lastLine.substr(24); 
            trace(artistAndSong);
        } catch(e:Error) {
    
        }
    }
    
    编辑2

    添加此函数并打印其结果,以尝试检测所涉及的字符是否存在问题。。。从parseTracks中调用它,如下所示:

    debugChars(data);
    
    
    function debugChars(str:String):void {
        var buffer:ByteArray = new ByteArray();
        buffer.writeUTFBytes(str);
        buffer.position = 0;
        var result:String = "";
        while(buffer.bytesAvailable) {
            result += "0x" + uint(buffer.readUnsignedByte()).toString(16) + ", ";
            if(buffer.position % 16 == 0) {
                result += "\n";
            }
    
        }
        //  print this string...
        trace(result);
    }
    

    我建议使用一些正则表达式进行字符串匹配,而不是进行字符串拆分

    var $lastLine:String = String(e.target.data).match(/.*$/);
    
    您还可以获取最后一行减去括号中的任何内容
    [^]]*$
    -但是如果艺术家的名称中有
    ]
    ,这可能会停止,但我还是会使用表达式从
    $lastLine
    中获取艺术家

    然后你可以用

    var $artistAndSong:String = $lastLine.match(/\*.*/);
    
    这将匹配第一个
    *


    如果你多玩一点正则表达式,你可以从中得到很多好处,但是使用类似

    的东西来代替字符串拆分,我建议使用一些正则表达式来匹配字符串

    var $lastLine:String = String(e.target.data).match(/.*$/);
    
    您还可以获取最后一行减去括号中的任何内容
    [^]]*$
    -但是如果艺术家的名称中有
    ]
    ,这可能会停止,但我还是会使用表达式从
    $lastLine
    中获取艺术家

    然后你可以用

    var $artistAndSong:String = $lastLine.match(/\*.*/);
    
    这将匹配第一个
    *

    如果你多玩一点正则表达式,你可以从中得到很多东西,但是使用一些东西总是有帮助的