Các phương pháp WebView trên cùng một lỗi chuỗi


84

Tôi có một chương trình android (Java + html trong chế độ xem web). Tôi có thể gọi từ mã javascript sang mã Java. Nhưng theo cách khác đã ngừng hoạt động (sau khi cập nhật trong nhật thực).

Vì vậy, đây là những gì tôi đang cố gắng làm

  • Tạo chế độ xem web (hoạt động)
  • gọi bằng javascript tới AndroidFunction.test (); (đã làm việc)
  • hàm java test () gọi webView.loadUrl ("javascript: helloBack ()"); (! không hoạt động nữa)

Tôi đã cố gắng để nó hoạt động với WebView trong MainActivity, nhưng nó không hoạt động.

MainActivity.java

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final WebView webView = (WebView)findViewById(R.id.webView);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.setWebChromeClient(new WebChromeClient());
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);

        javascr = new Javascript(this, webView);
        webView.addJavascriptInterface(javascr, "AndroidFunction");
        webView.loadUrl("file:///android_asset/www/index.html");

        ....
}

Javascript.java

public class Javascript {   
    Context cont;
    WebView webView;

    Javascript(Context c, WebView w) {
        cont = c;
        webView = w;
    }

    // function called in the javascript by AndroidFunction.test();
    public void test() {
          // Breaking point!!!
        webView.loadUrl("javascript:helloBack()");
    }

Lỗi:

03-24 11:47:50.103: W/WebView(21026):   at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27)
03-24 11:47:50.103: W/WebView(21026):   java.lang.Throwable: A WebView method was called on thread 'JavaBridge'. All WebView methods must be called on the same thread. (Expected Looper Looper{41ab68f8} called on Looper{41bb70a8}, FYI main Looper is Looper{41ab68f8})

03-24 11:47:50.103: W/WebView(21026):   at android.webkit.WebView.checkThread(WebView.java:2063)
03-24 11:47:50.103: W/WebView(21026):   at android.webkit.WebView.loadUrl(WebView.java:794)
03-24 11:47:50.103: W/WebView(21026):   at com.example.hellobt.Javascript.test(Javascript.java:24)

03-24 11:47:50.103: W/WebView(21026):   at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
03-24 11:47:50.103: W/WebView(21026):   at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27)
03-24 11:47:50.103: W/WebView(21026):   at android.os.Handler.dispatchMessage(Handler.java:102)

03-24 11:47:50.103: W/WebView(21026):   at android.os.Looper.loop(Looper.java:137)
03-24 11:47:50.103: W/WebView(21026):   at android.os.HandlerThread.run(HandlerThread.java:61)

Cảm ơn vì câu trả lời. Tôi đã chỉnh sửa hàm trong tệp Javascript của mình như thế này:

private void test(final String s) {
        webView.post(new Runnable() {
            public void run() {
                webView.loadUrl("javascript:" + s + ";");
            }
        });
        System.out.println("javscript done..");
    }

Trong bản chỉnh sửa của mình, bạn đề cập rằng bạn đã thay đổi mã của mình dựa trên (một trong số) (các) câu trả lời, làm cho nó có vẻ như điều này vẫn chưa giải quyết được vấn đề của bạn - nhưng có một câu trả lời được chấp nhận. Tôi khuyên bạn nên làm rõ ràng liệu điều này có giải quyết được vấn đề hay không (hoặc chỉ cần hoàn tác chỉnh sửa).
Tom

Câu trả lời:


212

Phương thức JavaScript được thực thi trên một luồng nền (tức là không phải giao diện người dùng). Bạn cần gọi tất cả các phương thức liên quan đến Chế độ xem Android trên chuỗi giao diện người dùng. Bạn có thể đạt được những gì bạn cần với:

mWebView.post(new Runnable() {
    @Override
    public void run() {
        mWebView.loadUrl(...).
    }
});

Mà sẽ đăng tác vụ để chạy trên chuỗi giao diện người dùng.


bạn đã thêm đoạn mã (mWebView) vào mã gốc của mình ở đâu?
Bowie

Trong hàm test (), hãy xem câu hỏi ở trên của tôi.
Johan Hoeksma

Điều gì xảy ra nếu bạn cần trả về một giá trị? ví dụ: trả về webview.getUrl? stackoverflow.com/questions/29748782/… @JohanHoeksma
Suresh Subedi

Bạn có biết vấn đề này xảy ra như thế nào và khi nào không? Trong Nexus 5X (Android 7.1.1) của tôi, không sao cả, nhưng một số thiết bị đã bị lỗi.
Ellie Zou,

làm thế nào để vượt qua một biến? Tôi đã cố gắng thêm biến trong mWebView.loadUrl ("javascript: test ('" + MyData + "');"); nhưng giá trị không bao giờ được chuyển sang javascript!
user1788736

14

Trong trường hợp của tôi, không có gì được hiển thị trong WebView, vì vậy tôi thích cách khác:

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        final WebView webView = (WebView) findViewById(R.id.map);
        webView.loadDataWithBaseURL(...);
    }
});

3

Điều này có thể được giải quyết bằng cách sử dụng phương pháp đăng. Vui lòng đi qua mã dưới đây.

 m_targetView.post(new Runnable() {
                        @Override
                        public void run() {
                            m_targetView.loadUrl(".....");
                        }
                    });

2

Phiên bản Java : Bạn phải sử dụng giao diện Runnable và Post to Handler .

webView.post(new Runnable() {
          @Override
          public void run() {
             webView.loadUrl("file:///android_asset/www/index.html");
          }
       });

Phiên bản Kotlin :

webView.post(new Runnable {
   webView.loadUrl("file:///android_asset/www/index.html")
})
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.