我使用addJavascriptInterface()
方法向WebView添加了一个Javascript接口对象,我尝试使用WebView.loadUrl()
在该对象上调用方法。
该对象是一个名为JSInterface
的简单类。它有一个名为echo()
的方法,它不带参数并返回void。我传递给loadUrl()
的URL是"javascript:JSInterface.echo()"
(JSInterface也是我用于addJavascriptInterface()
的接口名称)。
当我运行附加的应用程序时,echo()
方法永远不会执行。 logcat或其他任何地方都没有错误。从Javascript调用echo()
我需要做什么?
这是所有来源的活动。
当然,在我发布问题之后,我发现了什么是错的。在附加的代码中,我从UI线程以外的线程调用addJavascriptInterface()
。将addJavascriptInterface()
移至onCreate()
可解决问题。
package test.pg;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;
public class TestActivity2
extends Activity
{
WebView webview;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
webview = (WebView) findViewById(R.id.webview);
webview.getSettings().setJavaScriptEnabled(true);
webview.loadUrl("file:///android_asset/www/invoke.html");
TimerThread t = new TimerThread(webview);
t.start();
}
class TimerThread
extends Thread
{
long lastRun;
WebView appView;
public TimerThread(WebView appView)
{
lastRun = System.currentTimeMillis();
this.appView = appView;
}
public void run()
{
try
{
while (true)
{
if (System.currentTimeMillis() - lastRun < 5000)
{
Thread.sleep(5000);
}
else
{
appView.addJavascriptInterface(new JSInterface(), "JSInterface");
InvokerThread t = new InvokerThread(appView);
t.start();
lastRun = System.currentTimeMillis();
}
}
}
catch (Exception e)
{
Log.e("InvokerThread", "exception=" + e.toString(), e);
}
}
}
class InvokerThread
extends Thread
{
WebView appView;
public InvokerThread(WebView appView)
{
this.appView = appView;
}
public void run()
{
String function = "javascript:JSInterface.echo()";
appView.loadUrl(function);
}
}
class JSInterface
{
public void echo()
{
System.out.println("JSInterface.echo()");
Log.i("JSInterface", "JSInterface.echo()");
}
}
}
答案 0 :(得分:0)
当然,在我发布问题之后,我发现了什么是错的。在附加的代码中,我从UI线程以外的线程调用addJavascriptInterface()。将addJavascriptInterface()移动到onCreate()可以解决问题。