2016-09-26 9 views
-1

私のアプリには埋め込みjarライブラリがあります。 OnCreateメソッドでは、私のコードに見られるようにライブラリをインスタンス化する必要があります。このライブラリを使用する他の方法はありません。 ハンドラが呼び出され、メッセージの結果が利用可能になりますが、使用可能になった時点でValueFromHandlerをOnCreateメソッドに戻す機会はありません。 私の質問は:ちょうどハンドラがどのように呼び出し元に値を返す必要があるように見えるかを見て誰か小さなコードスニペットがありますか?Handlerから価値を取り戻す

これは私のコードです:

public class MainActivity : Activity{ 
JarLibrary jarlib; 

protected override void OnCreate(Bundle bundle) 
{ 
    base.OnCreate(bundle);   
    SetContentView(Resource.Layout.Main); 
    jarlib = new JarLibrary(this, new JarHandler(), null); 

    jarlib.Run(ValueFromHandler) //Here I would need the value back from the handler 

}} 

public class JarHandler : Handler 
{ 
    public override void HandleMessage(Message msg) 
    { 
     switch (msg.What) 
     { 
      case jarlib.MessageStateChange: 
       if (msg.Arg1 == jarlib.StateReadyToRun) 
       { 
        ValueFromHandler = msg.Obj; 
        Console.WriteLine(ValueFromHandler); //Once this value "msg.Obj" is available I need to bring it back to the caller (On Create) 
        Toast.MakeText(Application.Context, "Ready to run", ToastLength.Short).Show(); 
       } 
       break; 
     } 
    } 
} 
+0

「ValueFromHandler」の宣言はどこですか?おそらくグローバル化するのだろうか? –

+0

グローバルにすることができません – ildasm

+0

それは有益だった..なぜそれは動作しません? –

答えて

0

あなたは、あなたのメッセージを受信したときにコールバックActionを持つ選ぶことができます:

public class MainActivity : Activity 
{ 
    JarLibrary jarlib; 

    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle);   
     SetContentView(Resource.Layout.Main); 
     var handler = new JarHandler(); 
     jarlib = new JarLibrary(this, handler, null); 

     handler.OnHandleMessage = (s, o) => { 
      jarlib.Run(o); 
     }; 
    } 

    public class JarHandler : Handler 
    { 
     public Action<object> OnHandleMessage; 

     public override void HandleMessage(Message msg) 
     { 
      switch (msg.What) 
      { 
       case jarlib.MessageStateChange: 
        if (msg.Arg1 == jarlib.StateReadyToRun) 
        { 
         OnHandleMessage?.Invoke(this, msg.Obj); 

         Console.WriteLine(ValueFromHandler); //Once this value "msg.Obj" is available I need to bring it back to the caller (On Create) 
         Toast.MakeText(Application.Context, "Ready to run", ToastLength.Short).Show(); 
        } 
        break; 
      } 
     } 
    } 

あなたはまた違った、それを行うとで引数としてでMainActivityに渡すことができますあなたのJarHandlerクラスのコンストラクタです。次に、MainActivityにプロパティを設定し、その値で何かを実行します。

関連する問題