Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在WebView中加载HTML文件后执行JavaScript指令_Javascript_Android_Html_Webview_Handler - Fatal编程技术网

在WebView中加载HTML文件后执行JavaScript指令

在WebView中加载HTML文件后执行JavaScript指令,javascript,android,html,webview,handler,Javascript,Android,Html,Webview,Handler,我实现了一个Android程序,它将一个HTML文件加载到WebView中,HTML文件加载传单.js,根据您提供的提供者显示不同样式的地图 我使用以下指令在OnCreate()方法中加载页面: myWebView.loadUrl("file:///android_asset/test.html"); 之后,我需要从一个处理程序(类名为JavascriptInterface.java)中获取不同映射的列表,我将其添加到WebView中,如下所示: myWebView.addJavascript

我实现了一个Android程序,它将一个HTML文件加载到WebView中,HTML文件加载传单.js,根据您提供的提供者显示不同样式的地图

我使用以下指令在OnCreate()方法中加载页面:

myWebView.loadUrl("file:///android_asset/test.html");
之后,我需要从一个处理程序(类名为JavascriptInterface.java)中获取不同映射的列表,我将其添加到WebView中,如下所示:

myWebView.addJavascriptInterface(new JavaScriptInterface(this, myWebView), "MyHandler");
myWebView.loadUrl("file:///android_asset/test.html");
myWebView.loadUrl("javascript:window.MyHandler.getMaps()");
myWebView.loadUrl("file:///android_asset/test.html");

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    public void run() {
        // Actions to do after 1 second
        myWebView.loadUrl("javascript:window.MyHandler.getMaps()");
    }
}, 1000);
最终代码需要如下所示:

myWebView.addJavascriptInterface(new JavaScriptInterface(this, myWebView), "MyHandler");
myWebView.loadUrl("file:///android_asset/test.html");
myWebView.loadUrl("javascript:window.MyHandler.getMaps()");
myWebView.loadUrl("file:///android_asset/test.html");

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    public void run() {
        // Actions to do after 1 second
        myWebView.loadUrl("javascript:window.MyHandler.getMaps()");
    }
}, 1000);
问题是第一个loadUrl()的速度不够快,因此第二个loadUrl在映射初始化之前运行,导致了很多问题

我发现的一个临时的、也是可怕的解决方案是在执行第二个loadUrl之前保持第二个loadUrl 1秒,如下所示:

myWebView.addJavascriptInterface(new JavaScriptInterface(this, myWebView), "MyHandler");
myWebView.loadUrl("file:///android_asset/test.html");
myWebView.loadUrl("javascript:window.MyHandler.getMaps()");
myWebView.loadUrl("file:///android_asset/test.html");

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    public void run() {
        // Actions to do after 1 second
        myWebView.loadUrl("javascript:window.MyHandler.getMaps()");
    }
}, 1000);

有更好的方法在一条指令之后执行另一条指令吗?我已经尝试使用ASyncTask,但有可能我没有很好地实现它。

请调用myWebView.loadUrl(“javascript:window.MyHandler.getMaps()”;内部Webview onPageFinished事件

     myWebView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
               Log.d("WebView", "onPageStarted " + url);
            }
            @Override
            public void onPageFinished(WebView view, String url) {
               myWebView.loadUrl("javascript:window.MyHandler.getMaps()");
            }
        });
     myWebView.loadUrl("file:///android_asset/test.html");

谢谢你的回答!