addJavascriptInterface

addJavascriptInterface

我已经使用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()可以解决此问题。

09-11 17:17