当试图在WebView中调用JavaScript时,“连接到服务器失败”

问题描述:

与此处相同标题的其他问题不同,PhoneGap/Android应用工作正常,并且加载视图和外部链接的JavaScript文件除了尝试从Java端调用JavaScript方法。我打电话的方法,像这样:当试图在WebView中调用JavaScript时,“连接到服务器失败”

public void update(final String data) { 
    appView.post(new Runnable(){ 
     @Override 
     public void run(){ 
      loadUrl("javascript: dispatch('" + data + "')"); 
     } 
    }); 
} 

而且update被称为在非UI线程。

问题是我打电话给javascript方法,功能运行正常,并且做了我所期望的,但几秒钟后,应用程序崩溃,出现错误消息“连接到服务器失败”以及我所调用的方法的名称。我尝试增加其他问题中建议的超时时间,但在超时结束时它仍然崩溃。

顺便提一句,我也收到一条关于从非UI线程调用的WebView方法的警告,这就是为什么我添加了post调用,所以我不确定为什么会发生这种情况,但它发生在超时日志中的错误,所以也许它是相关的?

编辑

我得到这个错误,权当崩溃发生在日志中。

03-26 15:21:38.671: W/webview(3159): java.lang.Throwable: Warning: A WebView method was called on thread 'Thread-206'. All WebView methods must be called on the UI thread. Future versions of WebView may not support use on other threads. 
03-26 15:21:38.671: W/webview(3159): at android.webkit.WebView.checkThread(WebView.java:9468) 
03-26 15:21:38.671: W/webview(3159): at android.webkit.WebView.stopLoading(WebView.java:2253) 
03-26 15:21:38.671: W/webview(3159): at org.apache.cordova.DroidGap$1$1.run(DroidGap.java:549) 
03-26 15:21:38.671: W/webview(3159): at java.lang.Thread.run(Thread.java:856) 
03-26 15:21:38.675: E/DroidGap(3159): DroidGap: TIMEOUT ERROR! - calling webViewClient 

有人告诉我appView.post会避免这一点,因为它会导致loadUrl呼吁在UI线程中发生。显然情况并非如此?

编辑

问题解决了。为了记录,我将loadURL行更改为:

sendJavascript("dispatch('" + data + "')"); 

它正常工作。

你最好打电话:

this.sendJavaScript("dispatch(('" + data + "')"); 

如果您的Java类的扩展插件。

+0

我不扩展插件,所以我不认为这会有所帮助。 – jyurek 2012-03-26 20:08:12

+0

您可能需要重构一下代码,使其成为一个插件,因为它会使JS更加方便地进行本地通信。 – 2012-03-27 13:27:46

+0

事实证明,随着更多的谷歌搜索,其他人也推荐sendJavascript。我以为我以正确的方式发送了这个消息,但事实证明,我并没有这么做。 Eclipse在抱怨我如何使用它。似乎有关于这种方法的宝贵的小文档,尽管它显然是正确的使用方法。 – jyurek 2012-03-27 13:38:05

你需要添加一个URL超时。它是一个在android中的bug。

修改它像这样

public void update(final String data) { 
    super.setIntegerProperty("loadUrlTimeoutValue", 60000); 
    super.loadUrl("javascript: dispatch('" + data + "')"); 
} 
+0

不,这似乎没有帮助。无论我改变超时到那里,它只是等待那么久,然后用相同的错误信息退出。 – jyurek 2012-03-26 19:22:43

+0

尝试增加超时到一些东西像120000,并检查.... – 2012-03-26 19:25:50

+0

@jyurek删除appView.post并直接运行它没有任何线程...我已编辑我的帖子 – 2012-03-26 19:33:11