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
j2ko:Hm ..私は 'webView'クラスフィールドを作成し、view.post(r)をwebView.post(r)に置き換えました。 WebViewはウィンドウにアタッチされていても表示されますが、結果は同じです。 – Rediska
j2ko:私はWebViewではなく、ウィンドウに接続されたビューで実行可能ファイルをポストしようとしました。だからあなたは正しいと思われ、私はあなたの答えを受け入れています。ありがとう。私はまだそれがWebViewで動作しない理由に困惑しています。 – Rediska