2011-11-18 89 views
3

我已經使用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()"); 
    } 
    } 
} 
+0

我不能直接說出它無法正常工作的原因,但我確實相信接口是通過'WebView'在頁面級別註冊的,而'loadUrl'方法可能不像執行任意腳本那樣接受。然而,它確實提出了需要這種設計的問題。當然,如果你的意圖是調用一個託管對象方法,並且你已經在託管代碼中,那麼請求WebView爲你調用託管接口只不過是一個不需要的阻抗。如果你的例子當然是純粹的微不足道的概念證明,那麼設計論證是沒有意義的。 –

+0

@Quintin這個例子只是一個概念證明。最初的目標是調用一些任意的JS函數,並將其結果返回給本機代碼。但是,我遇到了問題,根本沒有被回電,因此這個例子。 –

回答

0

當然,之後我後,我弄清楚什麼是錯的問題。在附加代碼中,我從UI線程以外的線程調用addJavascriptInterface()。將addJavascriptInterface()移動到onCreate()可以解決問題。

相關問題