4

この質問に似ていますが、私のケースでは解決策が機能していません。

関数 webview.loadUrl を実行すると Android アプリがクラッシュし、
閉じるときに次のエラーが発生します。

E/AndroidRuntime(1593): 原因: java.lang.Throwable: 警告: スレッド 'WebViewCoreThread' で WebView メソッドが呼び出されました。すべての WebView メソッドは、UI スレッドで呼び出す必要があります。WebView の将来のバージョンでは、他のスレッドでの使用がサポートされなくなる可能性があります。

編集: runOnUiThread(new Runnable(){ }) で関数を実行しようとしていますが、エラーが発生し、コンテキスト内で runOnUiThread を入力する場所に問題があります。
完全なコードは次のとおりです。

   public class MyJavaScriptInterface {  
         @JavascriptInterface 
             public void androidFieldPrompt(String title, String msg, final String funct) {  
                 final EditText input = new EditText(MainActivity.this);  
                 AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);                 
                 alert.setTitle(title);  
                 alert.setMessage(msg);  
                 alert.setView(input);
                 alert.setPositiveButton("OK", new DialogInterface.OnClickListener() {    
                    public void onClick(DialogInterface dialog, int whichButton) {  
                        String value = input.getText().toString();  

                        // ERROR IS BEING THROWN HERE
                        webView.loadUrl("javascript:window."+funct+"('"+value+"')"); 

                        return;                  
                       }  
                    });  
                alert.show();        
             }
   }
4

2 に答える 2

7

E/AndroidRuntime(1593): 原因: java.lang.Throwable: 警告: スレッド 'WebViewCoreThread' で WebView メソッドが呼び出されました。すべての WebView メソッドは、UI スレッドで呼び出す必要があります。WebView の将来のバージョンでは、他のスレッドでの使用がサポートされなくなる可能性があります。

エラーが指摘しているように..非UIスレッド(クリックリスナー内)でwebviewメソッドを呼び出しています。

onClick内でWebビューメソッドを呼び出すときにメインスレッドを使用するには、 runOnUiThreadを使用する必要があります

  MainActivity.this.runOnUiThread(new Runnable(){
       @Override
        public void run() {
           String value = input.getText().toString();
           webView.loadUrl("javascript:window."+funct+"('"+value+"')");
           return;
        }
 });
于 2013-10-26T16:31:53.563 に答える
1

または、Runnable を使用して UI スレッドで WebView を使用し、問題を解決することもできます。

webView.post(new Runnable()
{
    @Override
    public void run()
    {
       String value = input.getText().toString();
       webView.loadUrl("javascript:window."+funct+"('"+value+"')");
    }
});
于 2016-07-08T12:46:22.447 に答える