2011-11-18 8 views
3

addJavascriptInterface() 메서드를 사용하여 WebView에 Javascript 인터페이스 객체를 추가했으며 WebView.loadUrl()을 사용하여 해당 객체에 대한 메소드를 호출하려고합니다.

개체는 JSInterface이라는 간단한 클래스입니다. echo()이라는 단일 메서드가 있으며 매개 변수를 사용하지 않고 void를 반환합니다. loadUrl()에 전달하는 URL은 "javascript:JSInterface.echo()"입니다 (JSInterface는 addJavascriptInterface()에 사용 된 인터페이스 이름이기도 함).

첨부 된 앱을 실행하면 echo() 메서드가 실행되지 않습니다. logcat 또는 다른 곳에서는 오류가 없습니다. Javascript에서 echo()을 호출하려면 무엇이 필요합니까?안드로이드 loadurl이 자바 스크립트를 실행하지 못합니다

이것은 모든 출처에 대한 활동입니다.


무엇이 잘못되었는지 질문을 게시 한 직후입니다. 첨부 된 코드에서 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()로 이동하면 문제가 해결됩니다.

관련 문제