美文网首页
React Native Android中Callback的调用

React Native Android中Callback的调用

作者: xinguoshui | 来源:发表于2018-05-16 18:31 被阅读0次

官方example如下:


public class UIManagerModule extends ReactContextBaseJavaModule {

...

  @ReactMethod

  public void measureLayout(

      int tag,

      int ancestorTag,

      Callback errorCallback,

      Callback successCallback) {

    try {

      measureLayout(tag, ancestorTag, mMeasureBuffer);

      float relativeX = PixelUtil.toDIPFromPixel(mMeasureBuffer[0]);

      float relativeY = PixelUtil.toDIPFromPixel(mMeasureBuffer[1]);

      float width = PixelUtil.toDIPFromPixel(mMeasureBuffer[2]);

      float height = PixelUtil.toDIPFromPixel(mMeasureBuffer[3]);

      successCallback.invoke(relativeX, relativeY, width, height);

    } catch (IllegalViewOperationException e) {

      errorCallback.invoke(e.getMessage());

    }

  }

...

callback的实现是CallbackImpl,code如下:


public final class CallbackImpl implements Callback {

  private final JSInstance mJSInstance;

  private final int mCallbackId;

  private boolean mInvoked;

  public CallbackImpl(JSInstance jsInstance, int callbackId) {

    mJSInstance = jsInstance;

    mCallbackId = callbackId;

    mInvoked = false;

  }

  @Override

  public void invoke(Object... args) {

    if (mInvoked) {

      throw new RuntimeException("Illegal callback invocation from native "+

        "module. This callback type only permits a single invocation from "+

        "native code.");

    }

    mJSInstance.invokeCallback(mCallbackId, Arguments.fromJavaArgs(args));

    mInvoked = true;

  }

}

JSInstance的实现是CatalystInstanceImpl,


  @Override

  public void invokeCallback(final int callbackID, final NativeArray arguments) {

    if (mDestroyed) {

      FLog.w(ReactConstants.TAG, "Invoking JS callback after bridge has been destroyed.");

      return;

    }

    jniCallJSCallback(callbackID, arguments);

  }

然后会调用CatalystInstanceImpl.cpp中的jniCallJSCallback


  instance_->callJSCallback(callbackId, arguments->consume());

之后会调用Instance.cpp


void Instance::callJSCallback(uint64_t callbackId, folly::dynamic &¶ms) {

  SystraceSection s("Instance::callJSCallback");

  callback_->incrementPendingJSCalls();

  nativeToJsBridge_->invokeCallback((double)callbackId, std::move(params));

}

然后就是native发到JS,进行触发相应的方法了。

相关文章

网友评论

      本文标题:React Native Android中Callback的调用

      本文链接:https://www.haomeiwen.com/subject/xtdmdftx.html