2016-08-31 5 views
0

javascriptインターフェイスメソッドからメインスレッドで実行されるRunnableをポストしようとしています。 私はすべてがうまくいくと信じている3つの異なる方法でそれを行います。 しかし、実際には2つしか動作しません。 何らかの理由で、View.post(Runnable)が機能しません。 私は理由を説明したい。javascriptインターフェイスからのUIスレッドへの投稿

これはソースです:

package com.package1.test; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Looper; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.View; 
import android.webkit.JavascriptInterface; 
import android.webkit.WebSettings; 
import android.webkit.WebView; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     WebView webView = new WebView(this); 
     WebSettings ws = webView.getSettings(); 

     ws.setJavaScriptEnabled(true); 
     webView.addJavascriptInterface(new JavaObject(),"obj"); 
     setContentView(webView); 
     webView.loadUrl("javascript:obj.test(0); "); 
    } 

    static class Runner implements Runnable { 
     private String msg; 

     public Runner(String msg) { 
      this.msg = msg; 
     } 

     @Override 
     public void run() { 
      String name = Thread.currentThread().getName(); 
      Log.i("Test","Execute on thread "+name+": "+msg); 
     } 
    } 

    class JavaObject { 
     private View view; 

     public JavaObject() { 
      this.view = new View(MainActivity.this); 
     } 

     @JavascriptInterface 
     public void test(final int value) { 
      Log.i("Test","called on "+Thread.currentThread().getName()+" thread"); 
      doOnMainThread1(new Runner("Method 1")); 
      doOnMainThread2(new Runner("Method 2")); 
      doOnMainThread3(new Runner("Method 3")); 
     } 

     public void doOnMainThread1(Runnable r) { 
      view.post(r); 
     } 

     public void doOnMainThread2(Runnable r) { 
      new Handler(Looper.getMainLooper()).post(r); 
     } 

     public void doOnMainThread3(Runnable r) { 
      MainActivity.this.runOnUiThread(r); 
     } 

    } 
} 

これは、ログ出力されます:

08-31 19:34:02.703 22359-22419/com.package1.test I/Test: called on JavaBridge thread 
08-31 19:34:02.771 22359-22359/com.package1.test I/Test: Execute on thread main: Method 2 
08-31 19:34:02.772 22359-22359/com.package1.test I/Test: Execute on thread main: Method 3 

答えて

1

View.post(Runnable r)は(あなたがレイアウトに追加する必要があります)このビューがウィンドウに添付されている場合にのみトリガされます。それ以外の場合、RunnableRunQueueに収集されます。最終的にウィンドウに接続すると、RunQueueの投稿アクションが実行されます。詳細は、View.post(Runnable r)implementation

+0

j2ko:Hm ..私は 'webView'クラスフィールドを作成し、view.post(r)をwebView.post(r)に置き換えました。 WebViewはウィンドウにアタッチされていても表示されますが、結果は同じです。 – Rediska

+0

j2ko:私はWebViewではなく、ウィンドウに接続されたビューで実行可能ファイルをポストしようとしました。だからあなたは正しいと思われ、私はあなたの答えを受け入れています。ありがとう。私はまだそれがWebViewで動作しない理由に困惑しています。 – Rediska

関連する問題