我使用 PhoneGap 开发一个应用程序。我得到了一项位于后台且本地编码的服务(该服务和电话间隙应用程序位于同一项目中)。不幸的是,我想从此服务调用 javascript 函数。所以我在网上搜索并发现了一些有趣的东西:创建一个扩展Plugin的类并在其中进行一些处理。然后我发现了这个:
this.ctx.sendJavascript("myJavascriptFunction");
我用这段代码进行了测试,但发生了一些错误:
java.lang.NullPointerException
这是我的测试方法:
class c = new class();
c.execute("myFunction",null,null);
在c类中,execute方法是这样的:
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");
如何解决这个问题?
最佳答案
最后我找到了解决方案:实际上 NullPointerException 位于 ctx 上。 为了解决这个问题,我设置了对象 c 的 Context 值,如下所示:
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);
之前描述的execute方法中无需进行任何更改。但请注意调用 javascript 函数的方式。
埃尔万
关于java - 从 Java 调用 javascript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8820428/