BLOG ENTRY

AS3で外部JSONデータ読み込みのカスタムイベント[AS3][JSON]

actionscript3

ActionScript3からPHPへPOST投げて、レスポンスのJSONデータの読み込みが完了したら送出するカスタムイベントを試してみました。

目的としてはこういうことがしたかったわけです。
//あるURLにAS3のあるクラスからPOSTでデータを投げる。
//URL先のPHPでDBから値をとってきてJSONデータをレスポンスとして返す。
//そのJSONデータをAS3側で受け取って、読み込みが完了したらパースしてイベント送出する。
//完了イベント後に別クラスでtrace()する。

PHP側の処理は書くほどのことでもないので(というかめんどくさいので)割愛します。

[as3]
Main.as
package {
import flash.display.Sprite;
public class Main extends Sprite {
public function Main() {
var mjl:MyJsonLoader = new MyJsonLoader("★JSONデータのURL★");
mjl.addEventListener(MyEvent.MY_JSON_LOAD_COMPLETE, onLoadCompleteHandler);
}
private function onLoadCompleteHandler(e:MyEvent):void {
trace(e.type, e.myobj);
for (var i:int = 0; i < e.myobj.length; i++){
trace(e.myobj[i].id, e.myobj[i].user_id, e.myobj[i].title, e.myobj[i].host, e.myobj[i].filename, e.myobj[i].created, e.myobj[i].modified);
}
}
}
}
[/as3]

[as3]
MyEvent.as
package {
import flash.events.Event;
public class MyEvent extends Event {
public static const MY_JSON_LOAD_COMPLETE:String = "my_load_complete";
public var myobj:Object;
public function MyEvent(type:String, myobj:Object){
super(type);
this.myobj = myobj;
}
public override function clone():Event{
return new MyEvent(type, myobj);
}
public override function toString():String{
return formatToString("MyEvent", "type", "bubbles", "cancelable", "eventPhase", "myobj");
}
}
}
[/as3]

[as3]
MyJsonLoader.as
package {
import com.adobe.serialization.json.JSON;
import flash.events.EventDispatcher;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;
import flash.system.Security;
import flash.external.ExternalInterface;

public class MyJsonLoader extends EventDispatcher {
private var _page_url:String;
private var _loader:URLLoader;
private var _posturl:String;

public function MyJsonLoader(url:String):void {
_posturl = url;
// Security.loadPolicyFile(_posturl + "crossdomain.xml");
_get_page_url();
_send_data();
}

private function _get_page_url():void{
_page_url = String(ExternalInterface.call("function(){return location.href}"));
}

private function _send_data():void {
var vars:URLVariables = new URLVariables();
vars.url = _page_url; //postデータのキーと値

var req:URLRequest = new URLRequest();
req.url = _posturl;
req.method = URLRequestMethod.POST;
req.data = vars;

var loader:URLLoader = new URLLoader (req);
loader.dataFormat = URLLoaderDataFormat.TEXT;
loader.addEventListener(Event.COMPLETE, _onLoadJsonComplete);
loader.load(req); //loadでpostしてレスポンスを受け取る
}

private function _onLoadJsonComplete (e:Event):void {
var json:String = URLLoader(e.currentTarget).data;
var dataobj:Object= JSON.decode(json); //decode
dispatchEvent(new MyEvent(MyEvent.MY_JSON_LOAD_COMPLETE, dataobj));
}
}
}
[/as3]

おわり。

WRITE COMMENT


(required)


(required)


(required)

MENU

veltica creative of twitter