PhoneGap的 - Android的 - 调用的JavaScript从本地原因leakedwindow [英] Phonegap - Android - Calling javascript from native causes leakedwindow

查看:94
本文介绍了PhoneGap的 - Android的 - 调用的JavaScript从本地原因leakedwindow的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个基于PhoneGap的应用程序,我还需要从Java本地code调用JavaScript,反之亦然。

I'm developing a phonegap based application, and I also need to call javascript from Java native code, and vice versa

所以我增加了一个JavascriptInterface到droidGap活动(appView.addJavascriptInterface)。
但每次我从Java调用javascript中,与使用loadURL(JavaScript的:警报('你好')),之后将引发一个错误几秒钟:

So I added a JavascriptInterface to the droidGap activity (appView.addJavascriptInterface). But each time I call javascript from java, with loadUrl("javascript:alert('Hello')"), an error is raised some seconds after :

/PhoneGapLog( 2839): file:///android_asset/phonegap.js: Line 930 : JSCallback Error:                   
 Request failed.
 I/Web Console( 2839): JSCallback Error: Request failed. at         
 file:///android_asset/phonegap.js:930

然后,再过几秒钟后,应用程序crashs,以

And then, another few seconds later, the app crashs, with

E/WindowManager( 2839): Activity com.package.act has leaked                               
window com.android.internal.policy.impl.PhoneWindow$DecorView@2afbfb08 that was      
originally added here
E/WindowManager( 2839): android.view.WindowLeaked: Activity 
com.package.act has leaked window      
com.android.internal.policy.impl.PhoneWindow$DecorView@2afbfb08 that was originally added here
E/WindowManager( 2839):         at android.view.ViewRoot.<init>(ViewRoot.java:265)
E/WindowManager( 2839):         at   android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
E/WindowManager( 2839):         at          android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/WindowManager( 2839):         at android.view.Window$LocalWindowManager.addView(Window.java:424)
E/WindowManager( 2839):         at android.app.Dialog.show(Dialog.java:241)
E/WindowManager( 2839):         at android.app.AlertDialog$Builder.show(AlertDialog.java:816)
E/WindowManager( 2839):         at com.phonegap.DroidGap$6.run(DroidGap.java:1483)
E/WindowManager( 2839):         at android.os.Handler.handleCallback(Handler.java:587)  
E/WindowManager( 2839):         at android.os.Handler.dispatchMessage(Handler.java:92)
E/WindowManager( 2839):         at android.os.Looper.loop(Looper.java:123)
E/WindowManager( 2839):         at android.app.ActivityThread.main(ActivityThread.java:3701)
E/WindowManager( 2839):         at java.lang.reflect.Method.invokeNative(Native Method)
E/WindowManager( 2839):         at java.lang.reflect.Method.invoke(Method.java:507)
E/WindowManager( 2839):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
E/WindowManager( 2839):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624) 
E/WindowManager( 2839):         at dalvik.system.NativeStart.main(Native Method)

下面是我的code:

public class Bukkett extends DroidGap {

private JavascriptInterface itf;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    super.init();

    itf = new JavascriptInterface();
    appView.addJavascriptInterface(itf, "Interface");

    this.setIntegerProperty("loadUrlTimeoutValue", 70000);
    super.loadUrl("file:///android_asset/html/index.html");
}

public class JavascriptInterface {
    public void sayHello() {
        loadUrl("javascript:alert('hello');");      
         }
    }
}

在我的.js文件,我只是叫

In my .js file, I just call

 if (window.Interface)
         window.Interface.sayHello();

很好显示警报消息,但之后该应用程序crashs。

The alert message is well displayed, but the app crashs after that.

推荐答案

如果您需要调用你已经从JavaScript写的,你应该写一个PhoneGap的Andr​​oid插件的Java code:

if you need to call Java code that you've written from JavaScript you should write a PhoneGap Android plugin:

<一个href=\"http://wiki.phonegap.com/w/page/36753494/How%20to%20Create%20a%20PhoneGap%20Plugin%20for%20Android\" rel=\"nofollow\">http://wiki.phonegap.com/w/page/36753494/How%20to%20Create%20a%20PhoneGap%20Plugin%20for%20Android

我们已经处理了大量的Java和再次JS之间的通信中出现的问题。从你的Andr​​oid插件,你可以随时拨打sendJavascript(),以直接调用你的JavaScript,但在大多数情况下,你是最好返回PluginResult。

We've dealt with a lot of the issues that arise in communication between JS to Java and back again. From your Android plugin you can always call sendJavascript() in order to call your JavaScript directly but in most cases you are better off returning a PluginResult.

这篇关于PhoneGap的 - Android的 - 调用的JavaScript从本地原因leakedwindow的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆