从Java调用javascript函数

3

我使用PhoneGap开发应用程序。我有一个后台服务,是原生代码编写的(服务和PhoneGap应用程序在同一个项目中)。不幸的是,我想从这个服务调用一个JavaScript函数。于是我在网上搜索并找到了一些有趣的东西:创建一个扩展Plugin的类,并在其中进行一些处理。然后我找到了这个:

this.ctx.sendJavascript("myJavascriptFunction");

我用了这段代码进行测试,但是出现了一些问题:

java.lang.NullPointerException

这是我的测试方法:
class c = new class();
c.execute("myFunction",null,null);

在C类中,执行方法如下:
public PluginResult execute(String action, JSONArray args, String callbackId) {
if (action.equals("myFunction")){
    Log.d(TAG,"start actions to do");
    this.ctx.sendJavascript("nameOfFunctionToLaunch");
    Log.d(TAG,"end actions to do");
    return new PluginResult(PluginResult.Status.OK);
}
}

当应用程序启动时,我有第一个


Log.d(TAG,"start actions to do");

我该如何解决这个问题?

你尝试过导航到像 javascript:someFunction(); 这样的 JavaScript URL 吗? - dtanders
许多网络线程都说这不是正确的方法。此外,我不明白为什么,但我没有能力使用像这样的东西:object.loadUrl("javascript:function();"); - Erwan
2个回答

1

最终我找到了解决方案:实际上NullPointerException出现在ctx上。 为了解决这个问题,我设置了我的对象cContext值,如下所示:

c.setContext(use_An_Object_Of_Type_PhonegapActivity);

在编程中,为了获取对象,我会在这个方法中从AppActivity中获取它:
public class CloudPhoneAppActivity extends DroidGap {
private class NoScaleWebViewClient extends GapViewClient {

    public NoScaleWebViewClient(DroidGap ctx) {
        super(ctx);
        myApp.ctx = ctx;
    }

    public void onScaleChanged(WebView view, float oldScale, float newScale) {
        Log.d("NoScaleWebViewClient", "Scale changed: " + String.valueOf(oldScale) + " => " + String.valueOf(newScale));
    }
}
/** other stuff after**/ 
}

最终的解决方案如下:

class c = new class();
c.setContext(myApp.ctx);
c.execute("myFunction",null,null);

在之前描述的执行方法中没有任何更改需要进行。但是请注意如何调用JavaScript函数。

Erwan


0

你不能从插件中调用object.loadUrl("javascript:function();");,因为插件没有扩展Android的WebView。 要调用loadUrl,你需要将调用返回到扩展DroidGap的Home类。

在插件中,你可以定义

Home home = null;
Looper.prepare();
home = new Home();
home.somefunc();

并在somefunc调用中

super.loadUrl("javascript:function();");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接