我已經使用addJavascriptInterface()
方法向WebView添加了Javascript接口對象,並且我試圖使用WebView.loadUrl()
來調用該對象上的方法。
該對象是一個簡單的類,稱爲JSInterface
。它有一個名爲echo()
的單一方法,它不帶參數並返回void。我傳遞到loadUrl()
的URL是"javascript:JSInterface.echo()"
(JSInterface也是我用於addJavascriptInterface()
的接口名稱)。
當我運行附加的應用程序時,echo()
方法從不執行。 logcat或其他地方沒有錯誤。我需要做什麼來從Javascript調用echo()
?Android loadurl無法執行javascript
這是所有來源的活動。
這當然是正確的後,我發佈的問題,我找出了什麼是錯的。在附加的代碼中,我從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()");
}
}
}
我不能直接說出它無法正常工作的原因,但我確實相信接口是通過'WebView'在頁面級別註冊的,而'loadUrl'方法可能不像執行任意腳本那樣接受。然而,它確實提出了需要這種設計的問題。當然,如果你的意圖是調用一個託管對象方法,並且你已經在託管代碼中,那麼請求WebView爲你調用託管接口只不過是一個不需要的阻抗。如果你的例子當然是純粹的微不足道的概念證明,那麼設計論證是沒有意義的。 –
@Quintin這個例子只是一個概念證明。最初的目標是調用一些任意的JS函數,並將其結果返回給本機代碼。但是,我遇到了問題,根本沒有被回電,因此這個例子。 –