Android应用程序崩溃webview网址更改

时间:2013-10-25 23:11:05

标签: android multithreading url webview crash

与此question类似,但解决方案无法解决问题。

运行功能webview.loadUrl时,Android应用程序崩溃了 关闭时收到以下错误:

  

E / AndroidRuntime(1593):引起:   java.lang.Throwable:警告:在线程上调用了一个WebView方法   'WebViewCoreThread'。必须在UI上调用所有WebView方法   线。 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();        
             }
   }

2 个答案:

答案 0 :(得分:7)

  

E / AndroidRuntime(1593):引起:java.lang.Throwable:警告:A   在线程'WebViewCoreThread'上调用了WebView方法。所有WebView   必须在UI线程上调用方法。 WebView的未来版本   可能不支持在其他线程上使用。

正如错误所指出的那样..你在非UI线程上调用webview方法(在点击监听器内)。

在调用web视图方法时,你应该使用runOnUiThread来使用主线程,在onClick

里面
  MainActivity.this.runOnUiThread(new Runnable(){
       @Override
        public void run() {
           String value = input.getText().toString();
           webView.loadUrl("javascript:window."+funct+"('"+value+"')");
           return;
        }
 });

答案 1 :(得分:0)

或者,您可以使用Runnable在UI线程上使用WebView并消除此问题:

webView.post(new Runnable()
{
    @Override
    public void run()
    {
       String value = input.getText().toString();
       webView.loadUrl("javascript:window."+funct+"('"+value+"')");
    }
});