ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Adobe Flex (Macromedia Flex)コミュのイベントリスナーに登録したメソッドの影響を受けてから変数をreturnしたい

  • mixiチェック
  • このエントリーをはてなブックマークに追加
質問です。
汎用性のあるRed5のライブラリを作ろうとしています。
タイトルのまんまなんですが、下記のプログラムのncConnect()の戻り値で、"NetConnection.Connect.Success"などのコードを戻したいんですが、どうすればいいんでしょうか?
初期値の"###"がそのまま返ってきてしまいます。
クライアントプログラムのinit()が終わった後にred5.connectResultを参照するとちゃんとコードが入っているようです。
また、解りきった事ですが、whileでCPU使用率が100%になってしまいます。
解決方法をご存知の方がいらっしゃいましたら、よろしくお願いします。

環境
mxmlc Version 2.0.1 build 180927
java version "1.6.0_11"
Flash Player 10


/* red5.as */

package{
  import flash.net.NetConnection;
  import flash.net.NetStream;
  import flash.events.NetStatusEvent;
  import flash.events.SecurityErrorEvent;
  import flash.events.StatusEvent;
  import flash.utils.getTimer;
  import mx.controls.Alert;

  public class red5{

    public var nc:NetConnection;
    public var ns:Array;
    public var mic:Array;
    public var timer:Timer;

    //NetConnection接続結果
    public var connectResult:String="###";

    //NetConnection接続
    public function ncConnect(url:String,timeout:int=3000):String{
      nc = new NetConnection();
      nc.client = new CustomClient();
      nc.connect(url);
      nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatus);
      nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onSecurityError);
      var t:int=getTimer();
      while(connectResult=="###"){
        if(t+timeout<getTimer()){
          break;
        }
      }
      return(connectResult);
    }

    //イベントリスナー NetConnection接続結果
    private function onNetStatus(evt:NetStatusEvent):void{
      connectResult=evt.info.code;
    }

    //イベントリスナー NetConnection接続セキュリティエラー
    private function onSecurityError(evt:SecurityErrorEvent):void{
      connectResult=evt.text;
    }
  }
}


/* red5_client.mxml */

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()">
  <mx:Script>
    <![CDATA[
      import mx.controls.Alert;

      public var stream:red5;

      public function init():void{
        stream = new red5()
        var con:String = stream.ncConnect("rtmp://127.0.0.1/oflaDemo");
        Alert.show("return => "+con);
      }
    ]]>
  </mx:Script>
  <mx:Button label="Alert connectResult" click="Alert.show(stream.connectResult);"/>
</mx:Application>

コメント(2)

 非同期処理を利用する以上、メソッドの戻り値にするのは無理があるような(そもそもそれだと非同期処理の利点が無くなってしまう)。

 red5でEventDispatcherを継承して通信が完了した時に独自イベントをdispatchEventするようにして、
red5_client.mxmlはred5のインスタンスに独自イベントをaddEventListenerして受け取るようにするとか。
コメントありがとうございます。
dispatchEventというのは初めて知りました。
1番単純な方法として下記のようにする事でred5のインスタンスに直接addEventListener出来ました。

nc.addEventListener(NetStatusEvent.NET_STATUS,dispatchEvent);
nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR,dispatchEvent);

イベントをクライアント側で感知するだけなら、dispatchEventを使わなくともこういう方法もあった事に今更気づきました…。

stream.nc.addEventListener(NetStatusEvent.NET_STATUS,xxx);

これでやりたい事が出来そうです。
ありがとうございました!

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Adobe Flex (Macromedia Flex) 更新情報

Adobe Flex (Macromedia Flex)のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。