5

私は、webview に javascript コードを挿入する Android アプリを作成していますwebview.addJavascriptInterface

問題は、プロセスを開始した元のビューとは別のスレッドで javascript-callback が実行されていることです。そのため、元のビューにアクセスできません。

元のビューにアクセスするにはどうすればよいですか?

私はAPIレベル7を使用しています。

重要なコードの一部を次に示します。

JavaScript 呼び出し:

webview.addJavascriptInterface(this, "ACall");
webview.loadUrl("javascript: ACall.update();");

折り返し電話:

public void update() {
    TextView tv = (TextView) findViewById(R.id.tv);
    Log.v("test", "test");
    tv.setText("test");
}

そしてスタックトレース:

Uncaught handler: thread WebViewCoreThread exiting due to uncaught exception
ndroid.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRoot.checkThread(ViewRoot.java:2706)
at android.view.ViewRoot.requestLayout(ViewRoot.java:560)
at android.view.View.requestLayout(View.java:7918)
at android.view.View.requestLayout(View.java:7918)
at android.view.View.requestLayout(View.java:7918)
at android.view.View.requestLayout(View.java:7918)
at android.view.View.requestLayout(View.java:7918)
at android.widget.TextView.checkForRelayout(TextView.java:5380)
at android.widget.TextView.setText(TextView.java:2684)
at android.widget.TextView.setText(TextView.java:2552)
at android.widget.TextView.setText(TextView.java:2527)
at shylux.android.GameActivity.update(GameActivity.java:53)
at android.webkit.BrowserFrame.stringByEvaluatingJavaScriptFromString(Native Method)
at android.webkit.BrowserFrame.stringByEvaluatingJavaScriptFromString(Native Method)
at android.webkit.BrowserFrame.loadUrl(BrowserFrame.java:149)
at android.webkit.WebViewCore.loadUrl(WebViewCore.java:1449)
at android.webkit.WebViewCore.access$1400(WebViewCore.java:48)
at android.webkit.WebViewCore$EventHub$1.handleMessage(WebViewCore.java:890)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:611)
at java.lang.Thread.run(Thread.java:1096)

//////////////// 現在の解決策:

これが私の現在の解決策です。もっと良い方法がなければならないと思います。さまざまなタスクを実行したい場合、これには多くの作業が必要です。

public void update() {
    tv.post(new UpdateTask());
}

private class UpdateTask implements Runnable {
    public void run() {
        tv.setText("test");
    }
}
4

2 に答える 2

5

おかげで、私は同様の問題を抱えていました。の解決策runOnUiThreadは驚くほど簡単でした。

アクティビティのUIを、それが最初に作成されたスレッドの外部から更新することはできません。runOnUiThread()メソッドは、UIの変更を行うために使用されます。

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                button.setBackgroundResource(R.drawable.practice_ri_wrong_3);
            }
        });
于 2012-06-21T11:01:07.770 に答える
2

runOnUiThreadはあなたの友達です。ビューに必要な変更を加える Runnable を作成し、それを runOnUiThread に渡すだけです。痛みのないスレッド化の記事では、他にも考慮すべきオプションがいくつか提案されています (アクティビティを把握していない場合は、tv.post が問題になる可能性があります)。

于 2012-05-25T14:42:55.837 に答える