当前位置: 首页 > 面试题库 >

Javascript回调函数传递给Android

乌学博
2023-03-14
问题内容

我有一个用Java实现的javascript接口,该接口由Web视图中加载的javascript代码调用。

JS Inside webview:

Android.myFunction(function(data){
    console.log(data);
});

Java:

public class JavaScriptInterface {

    Context context;
    WebView webView;

    JavaScriptInterface(Context c, WebView w) {
        context = c;
        webView = w;
    }

    public void myFunction(String callback) {
        //when I log callback, it is "undefined"
         String someData = "Yay for data";
         String js =
             "javascript:(function() { "
                 + "var callback = " + callback + ";"
                 + "callback('" + someData + "');"
             + "})()";
        webView.loadUrl(js);
    }
}

通过webview加载的字符串最终是:

javascript:(function() {var callback = undefined; undefined();})()

我有一些想法:

一个。在JS中以字符串形式构建回调。

b。在将回调传递给Android.myFunction()之前,先调用回调的toString();

我的问题是,最好的方法是什么?我希望能够将对象传递到Android,并且魔术般地实现。显然,事实并非如此。;)接下来的最佳方法是什么?


问题答案:

您将无法以指定的方式传递该函数。您将一个函数传递给Android.myData,但是Android.myData需要一个字符串。相反,您可能想要

var myCallback = console.log;
Android.myFunction("myCallback");

您仍然有一个问题,您没有将任何数据传递给回调。尽管这与您的问题没有直接关系,但由于您将具有相同的转换为字符串或转换为字符串的问题(可以通过JSON解决…但是如果Android为您处理了这一部分,那就太好了),这将成为一个问题。

最后,您可以将javascript:字符串缩短为

String js = "javascript:" + callback + "();";

但是,当然,首先要测试;)



 类似资料:
  • 问题内容: 我正在尝试将一些参数传递给用作回调的函数,该怎么做? 问题答案: 如果您想要更一般的东西,可以使用arguments变量,如下所示: 但是否则,您的示例可以正常工作(可以在测试器中使用arguments [0]代替回调)

  • 问题内容: 我需要在Node.JS应用程序中观察少量目录: 问题在于fs.watch仅将文件名传递给回调函数,而没有包括它所在的目录。我是否可以通过某种方式将额外的参数传递给updated()函数,以便它知道文件在哪里? 我认为我正在寻找类似于Python的工具,如果有帮助的话。 问题答案: 您可以使用:

  • 问题内容: 我有一个函数,将回调函数作为参数,并用一个参数调用它。 我还有一个带有两个参数的函数:和。 我想将函数作为参数传递给,但我也想作为第二个参数()传递给。我怎样才能做到这一点? 问题答案: 只需创建一个包装回调: 或使用ECMAScript 6箭头功能:

  • 问题内容: 我试图将回调函数从控制器传递给指令。 这是回调函数代码: 指令用法: 指令代码: 模板中的回调用法: 但是,这给了我以下错误: 我看过很多类似的问题,但不明白我在哪里错了。 问题答案: 从指令中调用表达式方法时,您需要以格式传递指令中的参数,还应更正指令属性值以像 指令用法: 指令模板

  • 我正在尝试设置一个“事件接收器”类,将GLFW回调封装到用户可以从中继承的类中,但在将基类成员函数传递到GLFW“set callback”函数中时遇到问题。 这本质上提供了一个带有纯虚拟函数的基类,供用户继承和重写,以便在事件发生时提供自己的逻辑。用户定义的子类将被传递到更大的“应用程序框架”类中,该类将进行必要的调用以设置GLFW回调函数。 当然,您不能将成员函数作为函数参数传递,因为您必须提

  • 在async-nature-of-setState中我们已经提到过, setState其实是异步的. 因为出于性能优化考虑, React会将多次setState做一次批处理. 于是setState并不会在被调用之后立即改变我们的state. 这就意味着你并不能依赖于在调用setState方法之后state, 因为此时你并不能确认该state更新与否. 当然针对这个问题我们也有解决办法—用前一个st