Android loadurl无法执行javascript

时间:2011-11-18 22:22:40

标签: android android-webview

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

1 个答案:

答案 0 :(得分:0)

当然,在我发布问题之后,我发现了什么是错的。在附加的代码中,我从UI线程以外的线程调用addJavascriptInterface()。将addJavascriptInterface()移动到onCreate()可以解决问题。