首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从JavaScript本地调用JavaScript方法

从JavaScript本地调用JavaScript方法
EN

Stack Overflow用户
提问于 2017-01-10 14:06:29
回答 2查看 6.3K关注 0票数 3

我刚开始响应本机,但想知道是否可以从Java调用方法?我有一个利基设备,有一个物理按钮,我想用它来触发一个方法时,按下。

我看到了下面的插件https://github.com/artemyarulin/react-native-eval,但安卓的实现似乎已经过时了。

我已经搜索过了,但是所有的例子我都可以找到引用,从调用Java方法,而不是相反。

在此之前,非常感谢您。

编辑

我尝试使用下面@ide建议的方法来实现一个解决方案。到目前为止,我的尝试如下:

在我的MainActivity中有:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private String latestBarcode = "";

...

public String getLastestBarcode() {
  return this.latestBarcode;
}

public void setLatestBarcode(String barcode) {
  this.latestBarcode = barcode;
}

@Override
public void onBarcodeEvent(final BarcodeReadEvent event) {
  runOnUiThread(new Runnable(){
    @Override
    public void run() {
      String barcodeData = event.getBarcodeData();
      String tstp = event.getTimestamp();
      setLatestBarcode(barcodeData);
      Log.d("MainActivity", " TEST - barcodeData "+ barcodeData + " tstp : "+ tstp);
    }
  });
}
...

当用户按下物理硬件按钮时,此代码将从设备中获取一个条形码值。

在我的自定义React本机模块中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@ReactMethod
public void latestBarcode(Callback callback) {
  final Activity activity = getCurrentActivity();

  if(activity != null && activity instanceof MainActivity){
    callback.invoke(((MainActivity) activity).getLastestBarcode());
  }
  else {
    callback.invoke("");
  }
}

此方法接受该值并将其公开以响应本机。这是可以读取值的,但是当用户按下按钮时,我需要触发一个方法,所以这里是我的ReactiveNative模块,它现在是完整的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import android.app.Activity;
import android.util.Log;

import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.modules.core.DeviceEventManagerModule;

import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.Arguments;

import javax.annotation.Nullable;

// Import MainActivity
import com.myapp.MainActivity;

public class HoneywellCT50Module extends ReactContextBaseJavaModule {
  private ReactContext reactContext;

  public HoneywellCT50Module(ReactApplicationContext reactContext) {
    super(reactContext);
    this.reactContext = reactContext;
  }


  @ReactMethod
  public void latestBarcode(Callback callback) {
    final Activity activity = getCurrentActivity();

    if(activity != null && activity instanceof MainActivity){
      WritableMap params = Arguments.createMap(); // <--- Added WritableMap
      sendEvent("BarcodeRecieved", params); // <--- Added sendEvent

      callback.invoke(((MainActivity) activity).getLastestBarcode());
    }
    else {
      callback.invoke("");
    }
  }

  // Added sendEvent
  private void sendEvent(
    String eventName,
    @Nullable WritableMap params
  ) {
    this.reactContext
      .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
      .emit(eventName, params);
  }


  @Override
  public String getName() {
    return "HoneywellCT50";
  }
}

在“土著的反应”中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// I import DeviceEventEmitter
import { DeviceEventEmitter } from 'react-native'

componentDidMount () {
  // Listen for Honeywell Scans
  DeviceEventEmitter.addListener('BarcodeRecieved', this.getBarcodeValue)
}

// I want to trigger this method
getBarcodeValue () {
  console.log('Event Received')
  // This gets the barcode value, works ok
  HoneywellCT50.latestBarcode((value) => {
    this.setState({ barcode: value })
  })
}

使用上面的代码,我可以在没有Java/build错误的情况下构建项目,也看不到JS错误,但我不能触发事件。有人能帮我指出正确的方向吗?

EN

回答 2

Stack Overflow用户

发布于 2017-01-10 15:22:03

您想要做的是从Java发出一个发送到JavaScript的事件。您可以编写一个自定义本机模块,从JavaScript订阅它的事件,然后在您的本机代码中发出事件。参见本指南:http://facebook.github.io/react-native/docs/native-modules-android.html#sending-events-to-javascript

票数 3
EN

Stack Overflow用户

发布于 2017-01-12 01:39:59

好的,我有一些代码在工作。我不确定这是否是最好的解决方案,但现在我的理解有限,欢迎对以下方面的任何反馈:

MainActivity.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public void onBarcodeEvent(final BarcodeReadEvent event) {
  runOnUiThread(new Runnable(){
    @Override
    public void run() {
      String barcodeData = event.getBarcodeData();
      String tstp = event.getTimestamp();
      setLatestBarcode(barcodeData);
      Log.d("MainActivity", " TEST - barcodeData "+ barcodeData + " tstp : "+ tstp);
    }
  });

  WritableMap params = Arguments.createMap(); // <--- added

  getReactInstanceManager().getCurrentReactContext() // <--- added
    .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) // <--- added
    .emit("BarcodeReceived", params); // <--- added
}

通过在JS中使用以下内容,我可以触发一个React方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
componentWillUnmount () {
  this._barcodeListener.remove()
}

componentWillMount () {
  // Listen for Honeywell Scans
  this.getBarcodeValue = DeviceEventEmitter.addListener('BarcodeReceived', this.getBarcodeValue)
}

...

getBarcodeValue () {
  console.log('Event Received')

  HoneywellCT50.latestBarcode((value) => {
    this.setState({ barcode: value }, () => {
      console.log(this.state.barcode)
    })
  })
}

如果有经验的人读过这篇文章,我很想知道为什么我在上面编辑的代码不起作用。是因为我尝试在@ReactMethod中发出事件吗?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41579283

复制
相关文章
jquery调用javascript方法
本来想找个“优雅”一点的方法,类似C#在调用C++方法时候的Invoke之类的。没找到,后来想想,其实也没必要,直接写就好了,算最优雅了吧。只是少了VS的Intelligence,有点不习惯罢了。
_淡定_
2018/08/24
1.7K0
javascript本地分页
注意:本地分页适用于数据量小的地方,如果数据量大,不建议使用本地分页 var iTable = document.getElementById("iTable"); var rows = iTable.rows.length; var pageSize = 3;//每页显示条数 var pageNum = 0;//总页数 var current = 1; if(rows/pageSize > parseInt(rows/pageSize)){ pageNum = parseInt(rows/pa
Petrochor
2022/06/07
3400
匿名函数调用方法_javascript匿名函数
没错,匿名函数简单来说就是普通函数去掉名字,但是他不能单独定义与使用,下面是匿名函数的一些使用场景:
全栈程序员站长
2022/11/14
1.5K0
Python 运行JavaScript 调用JavaScript函数
我们在进行python爬虫爬取一些站点时,有时会用到js逆向的操作,这时候就需要python运行javascript来进行操作
Chuanrui 初见之旅
2022/11/14
1.1K0
JavaScript设计模式 --- 方法的链式调用
(function (factory) { if (typeof define === "function" && define.amd) { define([ "jquery" ], factory); } else { factory(jQuery); } }(function ($) { $.fn.slides = function (options) { var settings = $.extend({
李维亮
2021/07/09
6290
JavaScript 函数调用
在 HTML 中默认的全局对象是 HTML 页面本身,所以函数是属于 HTML 页面。
陈不成i
2021/07/19
2.2K0
JavaScript 调用栈
原文链接:https://note.noxussj.top/?source=cloudtencent 什么是调用栈? 我们写的 JS 代码大多数都是同步模式,也就是从上往下依次执行。后一个任务必须要等
菜园前端
2023/05/14
4680
JavaScript链式调用
一般的函数调用和链式调用的区别:链式调用完方法后,return this返回当前调用方法的对象。
wfaceboss
2019/04/08
1.7K0
JavaScript链式调用
JavaScript下载本地文件
网上很多关于JS下载文件操作的代码,都过于繁杂,偶然找到这个方法,务必记录一下,太简单实用了
全栈程序员站长
2022/06/28
1K0
selenium2java调用JavaScript方法封装
本人在学习selenium2java的时候,遇到元素存在但因为被其他元素挡住了,导致无法点击的问题,多方请教后,使用js点击解决了困扰。我又写了几个js点击元素的方法,现在分享出来,供大家参考。
FunTester
2019/08/27
1K0
Python调用JavaScript代码
在写爬虫经常会遇到很多JS代码,比如说某些参数加密,可以只用用Python来翻译,但是有时候代码不容易阅读(JS渣渣),所以这里直接去找一条捷径,直接用Python的第三方库去调用JS代码。
小歪
2018/10/23
1.6K0
JavaScript之调用栈
很早之前写过栈和堆的结构,非常简单的介绍了一下,主要是为了明白深拷贝和浅拷贝。最近突然发现了调用栈这个概念,理解这个概念对于一些函数的执行能更清晰的理解,比如递归。
wade
2020/04/24
7940
JavaScript之调用栈
JavaScript 如何读取本地文件
出于安全和隐私的原因,web 应用程序不能直接访问用户设备上的文件。如果需要读取一个或多个本地文件,可以通过使用input file和FileReader来实现。在这篇文章中,我们将通过一些例子来看看它是如何工作的。
青梅煮码
2023/03/02
4.7K0
JavaScript 如何读取本地文件
JavaScript 如何读取本地文件
出于安全和隐私的原因,web应用程序不能直接访问用户设备上的文件。如果需要读取一个或多个本地文件,可以通过使用input file和FileReader来实现。在这篇文章中,我们将通过一些例子来看看它是如何工作的。
前端小智@大迁世界
2020/05/26
9.9K0
JavaScript中的链式调用
链模式是一种链式调用的方式,准确来说不属于通常定义的设计模式范畴,但链式调用是一种非常有用的代码构建技巧。
WindRunnerMax
2020/11/27
8980
01- JavaScript 调用堆栈
JavaScript 引擎是一个单线程解析器,而单线程解析器由堆和单一调用栈组成。浏览器提供 Web APIs,比如:DOM,AJAX 和 定时器。
公众号---人生代码
2020/12/15
1.4K0
JavaScript中的链式调用
链模式是一种链式调用的方式,准确来说不属于通常定义的设计模式范畴,但链式调用是一种非常有用的代码构建技巧。
WindRunnerMax
2020/11/26
4.1K0
JavaScript——函数定义和调用
定义函数时,函数如果有参数,参数放到小括号里面,函数如果有返回值,返回值通过 return 关键字来返回
落雨
2022/04/07
29.7K0
JavaScript shift() 方法
如果数组是空的,那么 shift() 方法将不进行任何操作,返回 undefined 值。请注意,该方法不创建新数组,而是直接修改原有的 arrayObject。
acoolgiser
2019/01/17
1.1K0
学习Javascript之尾调用
总括: 本文介绍了尾调用,尾递归的概念,结合实例解释了什么是尾调用优化,并阐述了尾调用优化如今的现状。
Damonare
2020/02/23
1.2K0
学习Javascript之尾调用

相似问题

从方法调用Javascript方法

10

从Javascript调用方法

23

从javascript调用本地python脚本

10

从Javascript中的React原生调用本地Java方法

10

从javascript调用actionscript方法

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文