2016-09-01 20 views
1

私はJSとAndroidのWebViewページ(この例ではちょうどJSからの警告を表示)によってロードされ、変更したい:ページが応答しなくなった(evaluateJavascriptまたは.loadUrl("javascript:" ...を使用して)JavaScriptを評価した後Android WebView.loadUrl()はJavaScriptを評価した後にページをフリーズしますか?

private static final String script2 = "alert('hello world');"; 

webView.setWebChromeClient(new WebChromeClient() { 
     @Override 
     public boolean onJsAlert(WebView view, String url, String message, JsResult result) { 
      Toast.makeText(MainActivity.this, "Alert from js:\n" + message, Toast.LENGTH_LONG).show(); 
      return true; // ANSWER found:should return false in order NOT to freeze 
     } 
    }); 

webView.setWebViewClient(new WebViewClient() { 

     @Override 
     public void onPageFinished(WebView view, String url) { 
      getSupportActionBar().setTitle("Finishing "); 
      getSupportActionBar().setSubtitle(url); 

      if (cbScript2.isChecked()) { // true 
       runScript(script2); 
      } 

      getSupportActionBar().setTitle("Finished"); 
     } 
    }); 

private void runScript(String script) { 
    if (cbApi19.isChecked()) // true 
     webView.evaluateJavascript(script, null); 
    else 
     webView.loadUrl("javascript:" + script); 
} 

- それができます」スクロールするか、リンクをクリックします。 docsによると

evaluateJavascript

は非同期現在表示しているページのコンテキストでJavaScriptを評価します。

なぜページをフリーズしますか?ページの振る舞いに影響を与えずにJSを実行できますか?

答えて

0

私はWebChromeClientalertを使用していたのは、JSが動作しているかどうかを確認するためです。私はtrueを返していましたが、falseに変更した後はもう凍結していません(ソースコードで質問を更新し、修正できる箇所でコメントを更新しました)。

ドキュメント:

/** 
* Tell the client to display a javascript alert dialog. If the client 
* returns true, WebView will assume that the client will handle the 
* dialog. If the client returns false, it will continue execution. 
* @param view The WebView that initiated the callback. 
* @param url The url of the page requesting the dialog. 
* @param message Message to be displayed in the window. 
* @param result A JsResult to confirm that the user hit enter. 
* @return boolean Whether the client will handle the alert dialog. 
*/ 
public boolean onJsAlert(WebView view, String url, String message, 
     JsResult result) { 
    return false; 
} 
0

少し遅れて相手にうまくいけば、同じ問題に直面して他の誰かを助けます。

この問題は、JSアラートをネイティブで処理しようとしたときに発生し、アラートを使用して最終アクションについてJSに通知しない場合に発生します。 JsAlert変数は、ユーザがネイティブアラートを処理すると、cancelまたはconfirmアクションで呼び出される必要があります。

@Override 
public boolean onJsAlert(WebView view, String url, String message, JsResult result) { 
      new AlertDialog.Builder(this) 
         .setMessage(message) 
         .setPositiveButton(R.string.ok, (dialog, which) -> { 
          dialog.dismiss(); 
          result.cancel(); 
         }).setCancelable(false) 
         .show(); 

       return true; 
    } 
関連する問題