我已经使用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()");
}
}
}
最佳答案
当然,在我提出问题之后,我就知道出了什么问题。在所附的代码中,我从ui线程以外的线程调用addjavascriptinterface()。将addJavaScriptInterface()移动到onCreate()可以解决此问题。