フラッター:コミュニケーションの深さ - 送信端

環境:フラッターSDK v1.5.4-hotfix.1の @stableは
エンジンフラッター対応:52c7a1e849a170be4b2b2fe34142ca2c0a6fea1f

チャネル視点のプラットフォーム側に放置した後の概念の概要は、通信機構内に深い認知必要通っある詳細な分析を必要とし、before'veが学習FlutterJNI.dispatchPlatformMessageデータ呼を送信するために、プラットフォーム層(Java)の最終層を、呼が継続シーケンス:

FluttereJNI.dispatchPlatformMessage
  nativeDispatchPlatformMessage(FlutterJNI.java)
    DispatchPlatformMessage(platform_view_android_jni.cc:56)
      AndroidShellHolder::GetPlatformView(platform_view_android_jni.cc:421)
      PlatformViewAndroid::DispatchPlatformMessage(platform_view_android.cc:92)
        TaskRunners::GetPlatformTaskRunner => PlatformView::task_runners_
        new PlatformMessageResponseAndroid()
        new flutter::PlatformMessage(name, message, response)
        PlatformView::DispatchPlatformMessage
          PlatformView::Delegate::OnPlatformViewDispatchPlatformMessage() => Shell::On..()
            ::GetUITaskRunner
            TaskRunner::PostTask
            ...Engine::DispatchPlatformMessage

FINAL CALL C ++層にメッセージを送信するためのPlatformViewAndroid::DispatchPlatformMessage方法、および呼び出し、PlatformViewAndroidメンバーdelegate_OnPlatformViewDispatchPlatformMessage方法を、私たちは決定する必要がありPlatformView::Delegate、抽象カテゴリの実現を、それはメンバーが作成または割り当てられている場所を追跡するために、です。

コンストラクタのメンバーから、PlatformView::delegate_それが渡された外部を作成することで、PlatformViewAndroidあなたが知っている必要がありますので、デリゲートのサブクラスとして、それを通過した
PlatformViewAndroid彼らは、デリゲートを作成する際に、着信オブジェクトを、

android_shell_holder.cc:63知られているの作成PlatformViewAndroid、着信時のデリゲートオブジェクトは、実際にあるShellメンバーのその方法と非同期呼び出しでは、engine_方法、そのEngine::DispatchPlatformMessage方法

だから我々は必要

  1. クリアPlatformViewAndroidプロセスが作成されます
  2. 明確なEngine割り当てまたは作成するための機会

作成PlatformViewAndroidプロセス:

AndroidShellHolder::AndroidShellHolder()
  ThreadHost::ThreadHost
    platform_thread=
  fml::MessageLoop::EnsureInitializedForCurrentThread
  platform_runner=fml::MessageLoop::GetCurrent().GetTaskRunner()
  Shell::Create()
    DartVMRef::Create(settings)
    Shell::Create()
      TaskRunner::RunNowOrPostTask
        lamda() => Shell::CreateShellOnPlatformThread()
          Shell::CreateCallback<PlatformView>(Shell&) => on_create_platform_view
            new PlatformViewAndroid(Shell,...)
  

最も重要なのは、Shell::Createこの方法は、あなたが呼び出すコールバックを渡し、コールバック呼び出しShell::CreateShellOnPlatformThread()、コールバックを継続するon_create_platform_view中でその実装体をAndroidShellHolderコンストラクタコンテキスト。

シェル:: engine_ [エンジン]プロセスの作成:

第二の問題は、単に各質問の分析に着手する:私たちが作成しているShellの作成に時間をPlatformViewAndroidオブジェクト
shell.cc:38見たことはengine_、外部の着信であります

Shell::CreateShellOnPlatformThread()
  new Shell()
  on_create_platform_view  => AndroidShellHolder.on_create_platform_view
    std::make_unique<PlatformViewAndroid>()
  TaskRunner::RunNowOrPostTask
  ...lamda => engine = std::make_unique<Engine>() (shell.cc:131)
  Shell::Setup
    engine_ = std::move(engine); (shell.cc:388)

ではShell::CreateShellOnPlatformThreadまず、あなたが作成しShell、次に作成し、インスタンスをPlatformView作成し、ラムダの後、別の非同期実行をインスタンスをEngineインスタンス

これは、最終的には明らかに二つの重要なオブジェクトの前にタイミングの問題を作成します。

私たちは、非同期実行を分析の第一段階を呼び出すために継続しますEngine::DispatchPlatformMessage

Engine::DispatchPlatformMessage
  RuntimeController::DispatchPlatformMessage
    Window::DispatchPlatformMessage
      tonic::DartInvokeField(...,"_dispatchPlatformMessage")

これにより、ダートを呼び出すために、最終的な層


のでAndroidShellHolder、コンストラクタフラッターが作成しShellたオブジェクトを、そのまた、我々は明確にする必要があります。

作成AndroidShellHolderプロセス:

FlutterActivity.onCreate (FlutterActivity.java:89)
  FlutterActivityDelegate.onCreate() (FlutterActivityDelegate.java:160)
    FlutterView.FlutterView() (FlutterView.java:139)
      new FlutterNativeView(Context) (FlutterNativeView.java:47)
        FlutterNativeView.attach(this, false) (FlutterNativeView.java:165)
          FlutterJNI.attachToNative (FlutterJNI.java:423)
            AttachJNI(platform_view_android_jni.cc:149)
              java_object(env, flutterJNI)
              std::make_unique<AndroidShellHolder>(java_object)
              AndroidShellHolder::IsValid
              reinterpret_cast<jlong>

ものを作成するための時間を見つけることは比較的容易FlutterJNIにバインドされているFlutterNativeView、とFlutterJNIのメンバーnativePlatformViewIdの代表をC ++でAndroidShellHolder、この過程で重要などのオブジェクト、オブジェクトShellEngine作成されています。
そのため、毎回、送信データ(ダーツメソッド呼び出しまたはインターネット)であるFlutterJNIオブジェクトのメンバーはnativePlatformViewId、C ++層を通過に変換AndroidShellHolderすることによって、オブジェクトEngineダーツにコールの最終層

おすすめ

転載: www.cnblogs.com/lindeer/p/11110520.html