2015-04-20 1 views
0

Я пытаюсь вызвать метод WebView из метода, который вызывается javascript в webview. Webview затем должен вернуть значение, которое используется в методе.Android возвращает методы, которые нужно вызывать при одной ошибке потока

HTML событие -> Javascript -> jSinterface -> андроид метод < -> WebView

Видимо Webview работает в потоке пользовательского интерфейса, а JS нет и метода Webview должна быть вызвана из одной нити. Этот метод можно использовать для вызова методов из неини-нити:

webView.post(new Runnable() { 
     public void run() { 
      webView.loadUrl("javascript:" + s + ";"); 
     } 
    }); 

Но я хочу также вернуть результат. return webView.getUrl() например. Как я могу это сделать?

+0

Можете ли вы объяснить, где вы хотите, чтобы вернуть значение, и для которых использование? loadUrl недействителен. –

+0

public void getUrl() { Log.v ("Webview url", w.getUrl()); } Ошибка при вызове этого метода из javascript. @HugoGresse –

ответ

1

Как вы сказали, когда вы вызываете методы из JS в JavaBridge, а затем в свой класс из не-ui Thread, вы должны использовать прослушиватели/обратные вызовы. Когда вы сделали свой loadUrl, позвоните слушателю, чтобы передать нужный строковый url.

В этом примере я определил внутренний интерфейс с прослушивателем onGetWebViewUrl. Я зарегистрировал слушателя, реализовав интерфейс в одном классе, поэтому я могу легко его назвать.

Например:

public class WebViewProxy implement WebViewListener { 

    private WebView mWebView; 

    ... 

    @JavascriptInterface 
    public void onJsStuff(){ 
     webView.post(new Runnable() { 
      public void run() { 
       mWebView.loadUrl("javascript:" + s + ";"); 
       WebViewProxy.this.onGetWebViewUrl(mWebView.getUrl()); 
      } 
     }); 
    } 

    @Override 
    public void onGetWebViewUrl(String url){ 
     // call method 2 with this url 
    } 

    public interface WebViewListener { 

     void onGetWebViewUrl(String url); 
    } 
} 
+0

Javascript -> JavascriptInterface -> Android method1 <-> Метод Android 2 <-> Метод веб-просмотра. Как я могу вернуть mWebViewUrl из Android-метода 2 в Android-метод 1? В настоящее время он возвращает null, когда я возвращаю mWebViewUrl. Я предполагаю, что mWebView возвращается до того, как webview присваивает ему значение. @Hugo Gresse –

+0

, если вы находитесь в одном классе, и если вы задали 'mWebViewUrl' перед вызовом вашего метода 2, это не проблема. Убедитесь, что вы вызвали ваш метод 2 после 'mWebViewUrl = mWebView.getUrl();' @love_in_dreams –

+0

Метод 2 вызывает метод 1, метод 1 устанавливает mWebView, а затем возвращает его обратно в метод 2: public void method2 () {Log.v ("Url", method1()); } public String method1() {webView.post (new Runnable() { public void run() { mWebView.loadUrl ("javascript:" + s + ";"); mWebViewUrl = mWebView.getUrl(); } }); return mWebViewUrl;} –