Event.COMPLETE doesn't fire...
Monkey Targets Forums/Flash/Event.COMPLETE doesn't fire...
| ||
Hi all, I try to expand my MNet module to flash but I can't get it to work because no event is fired at all... The related HTML5 version works fine (async both). Here's the native code for flash (mnet.flash.as): class MNet { public function HttpGet( url:String, timeoutConnection:int ):void { var request:URLRequest = new URLRequest(); request.url = url; request.method = URLRequestMethod.GET; var loader:URLLoader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.TEXT; loader.addEventListener( Event.OPEN, onConnectionEstablished ); loader.addEventListener( ProgressEvent.PROGRESS, onRequestProcessing ); loader.addEventListener( Event.COMPLETE, onCompleted ); loader.addEventListener( IOErrorEvent.IO_ERROR, onIOError ); try { loader.load( request ); } catch( error:Error ) { trace( "Unable to load URL: " + error ); } print(url); } public function onConnectionEstablished():void { print("onConnectionEstablished"); } public function onRequestReceived():void { print("onRequestReceived"); } public function onRequestProcessing():void { print("onRequestProcessing"); } public function onCompleted( e:Event ):void { print("onCompleted"); onRequestComplete( e.target.data ); } public function onIOError():void { print("onIOError"); } public function onRequestComplete( response:String ):void { print("onRequestComplete"); } } Monkey interface: Strict Extern Class MNet = "MNet" Method HttpGet:Void( url:String, timeoutConnection:Int = 5000 ) Method onConnectionEstablished:Void() Abstract Method onRequestProcessing:Void() Abstract Method onIOError:Void() Abstract Method onRequestComplete:Void( response:String ) Abstract Method onRequestReceived:Void() Abstract End Class Public Class AsyncHttpGet Extends MNet Method New() End Method Method onConnectionEstablished:Void() Print "Connection established" End Method Method onRequestProcessing:Void() Print "Processing request" End Method Method onIOError:Void() Print "Error" End Method Method onRequestComplete:Void( response:String ) Print "Request complete" End Method Method onRequestReceived:Void() Print "Request received" End Method End Class And finally my test code: Strict Import mojo Import mnet Global testApp:HttpGetTest Class MyHttpGet Extends AsyncHttpGet Field result:String Method onRequestComplete:Void( response:String ) Print "R: " + response Self.result = response End Method Method getResult:String() Return result End Method End Class Function Main:Int() testApp = New HttpGetTest() Return 0 End Function Class HttpGetTest Extends App Field myhttp:MyHttpGet Method OnCreate:Int() SetUpdateRate(30) myhttp = New MyHttpGet() myhttp.HttpGet( "http://www.hexbattles.com/test/test.php" ) Return 0 End Method Method OnUpdate:Int() Return 0 End Method Method OnSuspend:Int() Return 0 End Method Method OnResume:Int() Return 0 End Method Method OnRender:Int() Cls DrawText( "Result: " + myhttp.getResult(), 10, 10 ) Return 0 End Method End Class I think the bug is in the flash native code. The function HttpGet is called correctly, it prints out the URL at the bottom but never gets into any of the event listeners... |
| ||
Wow, i was struggling with the same thing for hours. I'm too having this problem... I second you on this. |
| ||
You might be using a weak reference, make loader and request fields in the Mnet object so they are not garbage collected. A lot of people have problems with this in forums. If it isnt that try this: http://www.actionscript.org/forums/showthread.php3?t=126665 if it still doesnt work, make sure you are not loading info from a server that the SWF is not on, because then you would need a crossdomain.xml file on the remote server. another thing to try: http://stackoverflow.com/questions/603941/why-is-my-urlloader-not-dispatching-when-it-completes |
| ||
Thanks slenkar, I already tried that with the weak reference even though it shouldn't make any difference because it's set to false for addEventListener so the GC doesn't remove it. Thanks for the link as well but this is for the Loader class not the URLLoader class. For the Loader you have to add the contentLoaderInfo... Part III might be the solution, don't know yet. I just want to load text from a remote server (just the URL). Do you mean with "server that the SWF is not on" the local flash file? I just start it from Monkey and of course it's started locally and should get updates there? edit: Regarding your second link, I already use URLLoaderDataFormat.TEXT. ;) I will create some simple test project in both pure native Actionscript and combined with Monkey... |
| ||
And here's the test project: http://www.xaron.net/dl/monkey/mnet_async.zip Copy the folder "mnet" into the modules folder and start the httpget.monkey file within the examples folder. HTML5 works fine async now but not flash. Will add async support meanwhile for iOS and Android... |
| ||
Part III might be the solution, don't know yet. I just want to load text from a remote server (just the URL). Do you mean with "server that the SWF is not on" the local flash file? I just start it from Monkey and of course it's started locally and should get updates there? paste this into a text file <?xml version="1.0" ?> <cross-domain-policy> <site-control permitted-cross-domain-policies="master-only"/> <allow-access-from domain="*"/> <allow-http-request-headers-from domain="*" headers="*"/> </cross-domain-policy> save as xml put the xml file on the root of the remote server alternatively upload the SWF to the server and run it in a webpage |
| ||
Alright... If I put it in the same webspace where my php file is located it works. :) I still understand this xml stuff though. What do you mean with remote server? I should be able to run the swf locally or at any place and it should be able to access any url?! So you mean I should put this xml file onto the webspace where my php file is located? That doesn't make sense to me, I guess I totally misunderstand you here. |
| ||
the remote server is www.xaron.net you should paste the above code into a textfile and then rename it as crossdomain.xml then simply upload the xml file to xaron.net (root html folder) then it should work so that you can you run the SWF from anywhere even on your pc's hard drive. These are security measures so a random swf cant access your database. you can get flash to tell you what went wrong: http://injun.ru/flash10api/flash/events/SecurityErrorEvent.html |
| ||
Thanks so much slenkar, will try this tomorrow! |
| ||
youre welcome, Im trying to use the example but nothing happens, even with the html5 version am I doing something wrong? in firefox I get : Connection established Request received but nothing in chrome |
| ||
HTML5 only works with IE9 due to reasons beyond my imagination. |
| ||
the flash one works, good job |