Actionscript 3 :: Error Reporting From Event Callback?
Aug 17, 2011
I have been experimenting with supplying better debugging information when an error happens in asynchronous code in AS3.
As an example of the poor error reporting be default, take the case where I force a null pointer in a Timer callback (github gist), I get the following stacktrace back on the console:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Function/<anonymous>()[/[path-to-source-file]/TestClass.as:14]
at flash.utils::Timer/_timerDispatch()
at flash.utils::Timer/tick()
This tells me very little about how the timer callback actually links to my code.
The question is: How can I get information about what code created the callback?
This might be more of a subjective question, but is it generally best practice to have one dedicated method per event-types that you add an event-listener?
Such as:
myButton.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver); myButton.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut); //Somewhere else in the code...
[Code].....
And if you had a MouseEvent.MOUSE_UP, MouseEvent.MOUSE_DOWN and other relevant MouseEvents event-listeners to watch for, you could even set a switch statement to handle all the various MouseEvent types.
I created an image uploader for an app I am working on. I first used php for the server side script, and everything worked fine. I found out afterwards I had to use .net, so I created new serverside scripts. The problem I am having is that my event.COMPLETE listener is never firing. I can receive data back using a DATAEVENT listener, but then it stops at this error: Error #2044: Unhandled IOErrorEvent:. text=Error #2036: Load Never Completed.
Here is how I am sending my file. var fileRefReq:URLRequest = new URLRequest(FILE_UPLOAD_TEMP); var fileReqVars:URLVariables = new URLVariables(); fileReqVars.subdir = "Temp"; fileRefReq.data = fileReqVars; fileRefReq.method = URLRequestMethod.POST; fileRef.upload(fileRefReq);
The file definitely gets uploaded to the first TEMP directory, but then it breaks with the above error.
In our app, I am periodically noticing that a particular event handler is not firing. 99% of the time, it works fine, but, every so often, it just dies. How can I find out whats happening? Is the DispatchEvent() not happening/working somehow? Is my listener still listening? Did something else catch the event, and not pass it along so that the 'right' listener can get to it ?
Here's a little bit of the code...
Thats a somewhat pruned down version of what the real code is, but I don't think I trimmed out anything important. The key, as I see it is that we fire up the params dialog, then start to listen for the closed event. Then, we show the param dialogs close function. What happens when it fails is that the trace message "caught close event.." is never generated, and, consequently, the closeHandler is not getting called at all.
I rarely use NetStream or any video in my projects, but someone I email with was wondering this, and I have no earthly idea.
Is there any reason why the NetStream's "onMetaData" event cannot be listened to using addEventListener, but instead requires you to use a callback function?
Is it faster, avoiding the overhead of events? Is it to prevent more than one listener being attached?
for(var i:int=0; i<someArray.length; i++) { var loader:Loader=new Loader(); loader.load(new URLRequest("http://testurl.com/test.jpg"));
[Code]....
The second paramter (i) for imageLoaded is always 1, I guess because i no longer exists and is defaulting to 1. Is it possible to get that second paramter to be evaluated when the load is started rather than on complete?
fileReference.addEventListener(Event.COMPLETE, uploadCompleteHandler); private function uploadCompleteHandler(event:Event):void {}
Above is one way to add an event listener in Actionscript. By default the callback function needs to have an argument with name event and type Event. Is there a way to declare this function without any arguments :
private function uploadCompleteHandler():void {}
Edit : It's possible to add an event handler without any arguments in mxml. So one student wanted to know, why isn't it possible to do the same in actionscript?
I have a flex app and I am adding a callback method like this:
private function init():void { ExternalInterface.addCallback( "playVideo", playVideo ); }
[code].....
However if I uncomment and run the alert first. I get no error and it works perfectly.My first thought was that the alert was buying time until the script could execute, so i tried to run the script inside a setTimeout() but did not work.
I've got a really weird problem that I've boiled down to its fundamentals, and I'm hoping that someone here smarter than I am knows why AS3 would be acting this way. Attached is a ZIP with a few FLAs and .AS files. I'm using Flash CS5. Please bear with me as I explain the situation.
I have a class called TestChildA: package testing { import flash.display.MovieClip;
[Code]...
For some reason, the fact that we're not trying to obtain a TestChildA reference allows the Frame 0 ActionScript in TestChildA.swf to execute properly. TestChildB, on the other hand, continues to fail Frame 0 execution since we're still getting a reference to it.
As we saw in the first version of the INIT handler above, querying the test_str variable out of the loaded content directly without trying to cast it worked fine. Why is it that using 'as' to get a specific reference to the content with the proper class results in the Frame 0 script of that content to fail running? Theoretically, the Frame 0 actions should have already been executed prior to reaching the INIT handler anyway, so it's doubly confusing.
If anyone has a better understanding than I of the ActionScript internals and can explain the reason for this issue,
I am running a very low volume (3-4 simulaneous users) video chat application on FMS version 4 and am seeing the following error generated from FMS (Core) about once or twice a week.Message callback is not set.Any idea what the cause of this might be and whether or not it is impacting anything?Additional information from the event log is as follows..
Log Name:Application Source: FMS (Core) Date:1/12/2012 9:07:28 AM
$('#trailer-dialog').mediaelementplayer({ enablePluginDebug: false, // remove or reorder to change plugin priority plugins: ['flash','silverlight'], // specify to force MediaElement to use a particular video or audio type
Is there a defined way to report bugs with the autoformat system to adobe (or do they even care may be a better question)? Also, is there a list anywhere of known bugs in CS5?In the last 24 hours I have come across several, and while some may be hyper specific (e.g. if you comment out a for each in loop and the comment is followed by a for in loop it will put semicolons where they dont belong and cause a syntax error), others are easy to do and hard to figure out (e.g. comments inside of for loops mess things up).
I have an html text field that displays content from an xml file, and a class that determines whether or not to show a scrollbar.The code that determines this is as straightforward as
if (field.maxScrollV>1){ showscrollbars() }
And 9 times out of ten it is working. Sometimes - it seems when the html contains <li> - maxScrollV is reporting '2' and the scrollbars are showing, even though all text is visible onscreen and it will not actually scroll at all.
The problem is I get Error: Error #2094: Event dispatch recursion overflow. Why does removechild keep getting called if this.parent does not exist? Why doesn't removing event listeners work?
I have an app that loads large imagery and swf assets on demand, presenting a movieclip that displays load status based on a ProgressEvent listener. When run locally and off of my own server everything looks as it should and I get accurate bytesLoaded and bytesTotal figures producing the correct load % displayed. However, when published to my client's server, the load status starts at 100% and doesn't ever change. The even stranger thing is that in Firefox it says 100% Loaded but in Safari it says Infinity% Loaded. Are there web server settings or differences I should consider here?
Say I have a movieclip called theScreen a 0,0. It is 800 wide, 700 hightheScreen contains a movieclip called theStatusArea at 600,0. It is 200 wide by 700 hightheStausArea contains a movieClip called pieces at 10, 410. It is 180 wide by 180 highpieces contains a number of movieclips (triangle, square, etc.),all of these sub movieclips are more narrow than the pieces container and are all set added to the pieces container at 0,0
var pt:Point = new Point(triangle.x, triangle.y) pt= triangle.localToGlobal(pt); trace(pt); // should be 610, 410 at least at the start.
I am preparing an offer for a customer. They proide weekly data to different organizations. There is huge amount data suits OLAP that needed to be visualized with charts and pivot tables on web and custom reports will be built by non-it persons (an easy gui). They will enter a date range, location which data columns to be included and generate report and optionally export the data to Excel. They currently prepare reports with MS Excel with Pivot Tables and but they need a better online tool now to show data to their customers. Tables are huge and need of drill-down functionality. My current knowledge Spring, Flex, MySql, Linux. I have some knowledge of PostgreSQL and MSSQL and Windows. What is the easiest way of doing this project. Do you think that SSRP (haven't tried yet) and ASP.NET better suits for this kind of job. Actually I prefer open source solutions. Flex have OLAP Data Grid control which do aggregation on client side. JasperServer seems promising but it seems I need enterprise version (multiple organizations and ad hoc queries). What about Modrian + Flex + PostgreSQL solution?
Im making a flash game and just wondering, how can I protect the ingame scores from being hacked ? For the moment im using a random number, which is set on the server and sent to the client, then using a hashing function which will hash 'score+randNumber' (a bit more complex, but the same idea), then i send the resulting score and the hash to the server (obviously logging attempted cheats). This so far works, but it is still easy to hack the score by decompiling the flash and finding out what the hashing formula is. Is there any other way that the scores can be transmitted to the server with little or no possibility of hacking?
How do I go about creating a socket based status reporting system for an AIR app? What I have in mind, is you connect to the app via socket connection with some sort of terminal. It presents you with a list of options, you issue commands back, and it reports back any stats and messages. (This is for an app running on a remote kiosk, connected via 3G.)
I've created some error handling for external images loaded via a path in XML. Within the Flash preview it's fine and shows the full error message (and most importantly, the URL that isn't loading).
But in the browser, even locally, it doesn't out put this message!
Here's my code:
function loadIOError(event:IOErrorEvent){ errorLog+=event.text+' '; }
detecting the totalFrames of content loaded into a Loader?
I made a dummy animation just for testing (150 frames of text just tweening across the screen) to load. I load that in and when it's loaded I'm always told it's only 2 frames long.
I just wrote that by hand now as an example so there might be a typo here or there but you get the general idea. I'm using CS5, flash player 10, just testing the movie and every time it traces 2 total frames. how to tell how many frames the loaded content actually has?
I will be releasing my Air/Flex application soon, but I am pretty sure there are a couple of bugs that may pop up on the various platforms that Air is available for. So I was wondering if there is a way to implement a mechanism, that would send an error report, logging where the error happened, to a remote server each time an app crashes? This way I might catch errors that otherwise would go unnoticed.
I need to create a textfield that is reporting events on stage dynamically (hitTests, onPress etc.). Something similar to output window in flash application. I want it to add events line by line, so afterall one can see what has been done.
My only experience with Flex is some limited reading over the web. What i am wondering is if i want to use Flex or some variant of it for generating reports, specifically Charts, coming off a Java/Oracle backend can i accomplish that in an environment where the streaming media (we cannot play videos on our systems at work) is turned off? Also, are there any other restrictions revolving around using Flex for reporting in the form of charts? Currently, we use Jfree Chart API to develop charts but just exploring an alternative.
1021: Duplicate function definition function onComplete1(event:Event):void { 1021: Duplicate function definition function stopSound1(event:MouseEvent):void { 1021: Duplicate function definition function backSound1(event:MouseEvent):void {
codes i used:
Code: var thereReq:URLRequest = new URLRequest("SOUNDS/how.mp3"); var there:Sound = new Sound(); var thereControl:SoundChannel = new SoundChannel();