Java 循环浏览WebView并等待onPageFinished完成

Java 循环浏览WebView并等待onPageFinished完成,java,android,multithreading,webview,synchronization,Java,Android,Multithreading,Webview,Synchronization,我在WebView中循环时遇到了一个问题,等待WebView完全加载,用javascript函数填充网页表单,然后创建WebView的图像 for (Integer id : idToQuery) { webView = new WebView(ctx); webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new getDataJSForPrint(), "A

我在WebView中循环时遇到了一个问题,等待WebView完全加载,用javascript函数填充网页表单,然后创建WebView的图像

for (Integer id : idToQuery) {

    webView = new WebView(ctx);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.addJavascriptInterface(new getDataJSForPrint(), "Android");

    webView.setWebViewClient(new WebViewClient(){
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);

            String someJsonData = "Lot of Data"; //only for example

            //init function use data to fill form in webpage
            webView.loadUrl("javascript:init(" + someJsonData+ ")");

            //get html String from WebView when finished to load                
            webView.loadUrl("javascript:window.Android.getHtmlFromWebView('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
        }
    });

    webView.loadUrl("file:///android_asset/index.html");

}
我试着把

synchronized (object) { object.wait(); }
加载URL后,尝试在getHtmlFromWebView的末尾通知它,但显然它不起作用

在for循环转到下一项之前,我可以做什么来等待getHtmlFromWebView完成


谢谢:)

我认为您的需求不需要
for
循环。您可以使用
递归
函数。试试这个

//for ArrayList; other appropriate methods if idToQuery is not ArrayList
int count = idToQuery.size();
int index = 0;

private void loadWebView() {
webView = new WebView(ctx);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.addJavascriptInterface(new getDataJSForPrint(), "Android");

    webView.setWebViewClient(new WebViewClient(){
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);

            String someJsonData = "Lot of Data"; //only for example

            //init function use data to fill form in webpage
            webView.loadUrl("javascript:init(" + someJsonData+ ")");

            //get html String from WebView when finished to load                
            webView.loadUrl("javascript:window.Android.getHtmlFromWebView('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
        }
    });

    webView.loadUrl("file:///android_asset/index.html");
}

//Call the loadWebView function again after the bitmap operation. Increment the index each time. Then you can compare it with total count to control how many times you wan to call    loadWebView function
public class getDataJSForPrint{

        @JavascriptInterface
        public void getHtmlFromWebView (String html) throws DocumentException, IOException{

            //got this piece of code in another answer of stackoverflow
            File imageTemp = new File (Environment.getExternalStorageDirectory(), "tmpImag.jpeg");

            webView.measure(MeasureSpec.makeMeasureSpec(
                    MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED),
                    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            webView.layout(0, 0, webView.getMeasuredWidth(),
                    webView.getMeasuredHeight());
            webView.setDrawingCacheEnabled(true);
            webView.buildDrawingCache();

            Bitmap bm = Bitmap.createBitmap(webView.getMeasuredWidth(),
                    webView.getMeasuredHeight(), Bitmap.Config.ARGB_8888);

            Canvas bigcanvas = new Canvas(bm);
            Paint paint = new Paint();
            int iHeight = bm.getHeight();

            bigcanvas.drawBitmap(bm, 0, iHeight, paint);
            webView.draw(bigcanvas);


            if (bm != null) {
                try {
                    OutputStream fOut = null;
                    fOut = new FileOutputStream(imageTemp);

                    bm.compress(Bitmap.CompressFormat.JPEG, 50, fOut);
                    fOut.flush();
                    fOut.close();
                    bm.recycle();

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }


            index++;
            if (index < count) {
                loadWebView()
            }


        }

    }
//用于ArrayList;如果idToQuery不是ArrayList,则使用其他适当的方法
int count=idToQuery.size();
int指数=0;
私有void loadWebView(){
网络视图=新网络视图(ctx);
webView.getSettings().setJavaScriptEnabled(true);
addJavascriptInterface(新的getDataJSForPrint(),“Android”);
setWebViewClient(新的WebViewClient(){
@凌驾
公共void onPageFinished(WebView视图,字符串url){
super.onPageFinished(视图、url);
String someJsonData=“大量数据”;//仅用于示例
//init函数使用数据在网页中填写表单
loadUrl(“javascript:init(“+someJsonData+”);
//完成加载后从WebView获取html字符串
webView.loadUrl(“javascript:window.Android.getHtmlFromWebView(“”+document.getElementsByTagName('html')[0]。innerHTML+“”);”;
}
});
webView.loadUrl(“file:///android_asset/index.html");
}
//位图操作后再次调用loadWebView函数。每次递增索引。然后您可以将其与总计数进行比较,以控制调用loadWebView函数的次数
公共类getDataJSForPrint{
@JavascriptInterface
public void getHtmlFromWebView(字符串html)引发DocumentException、IOException{
//在stackoverflow的另一个答案中找到了这段代码
File imageTemp=新文件(Environment.getExternalStorageDirectory(),“tmpImag.jpeg”);
webView.measure(MeasureSpec.makeMeasureSpec(
测量等级未指定,测量等级未指定),
MeasureSpec.makeMeasureSpec(0,MeasureSpec.unspect));
布局(0,0,webView.getMeasuredWidth(),
webView.getMeasuredHeight());
webView.setDrawingCacheEnabled(true);
webView.buildDrawingCache();
位图bm=Bitmap.createBitmap(webView.getMeasuredWidth(),
webView.getMeasuredHeight(),Bitmap.Config.ARGB_8888);
Canvas bigcanvas=新画布(bm);
油漆=新油漆();
int iHeight=bm.getHeight();
绘制位图(bm,0,iHeight,paint);
webView.draw(bigcanvas);
如果(bm!=null){
试一试{
OutputStream fOut=null;
fOut=新文件输出流(imageTemp);
bm.compress(Bitmap.CompressFormat.JPEG,50,fOut);
fOut.flush();
fOut.close();
bm.recycle();
}捕获(例外e){
e、 printStackTrace();
}
}
索引++;
如果(索引<计数){
loadWebView()
}
}
}

我尝试了你的代码,但getHtmlFromWebView从未被调用,尝试设置断点似乎忽略了java/javascript方法:(,我现在检查我的代码错误(我尝试得很快)ooook,我找到了一个解决方案,是我在一些代码行中犯的错误,非常感谢,递归就是这样:D
//for ArrayList; other appropriate methods if idToQuery is not ArrayList
int count = idToQuery.size();
int index = 0;

private void loadWebView() {
webView = new WebView(ctx);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.addJavascriptInterface(new getDataJSForPrint(), "Android");

    webView.setWebViewClient(new WebViewClient(){
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);

            String someJsonData = "Lot of Data"; //only for example

            //init function use data to fill form in webpage
            webView.loadUrl("javascript:init(" + someJsonData+ ")");

            //get html String from WebView when finished to load                
            webView.loadUrl("javascript:window.Android.getHtmlFromWebView('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
        }
    });

    webView.loadUrl("file:///android_asset/index.html");
}

//Call the loadWebView function again after the bitmap operation. Increment the index each time. Then you can compare it with total count to control how many times you wan to call    loadWebView function
public class getDataJSForPrint{

        @JavascriptInterface
        public void getHtmlFromWebView (String html) throws DocumentException, IOException{

            //got this piece of code in another answer of stackoverflow
            File imageTemp = new File (Environment.getExternalStorageDirectory(), "tmpImag.jpeg");

            webView.measure(MeasureSpec.makeMeasureSpec(
                    MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED),
                    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            webView.layout(0, 0, webView.getMeasuredWidth(),
                    webView.getMeasuredHeight());
            webView.setDrawingCacheEnabled(true);
            webView.buildDrawingCache();

            Bitmap bm = Bitmap.createBitmap(webView.getMeasuredWidth(),
                    webView.getMeasuredHeight(), Bitmap.Config.ARGB_8888);

            Canvas bigcanvas = new Canvas(bm);
            Paint paint = new Paint();
            int iHeight = bm.getHeight();

            bigcanvas.drawBitmap(bm, 0, iHeight, paint);
            webView.draw(bigcanvas);


            if (bm != null) {
                try {
                    OutputStream fOut = null;
                    fOut = new FileOutputStream(imageTemp);

                    bm.compress(Bitmap.CompressFormat.JPEG, 50, fOut);
                    fOut.flush();
                    fOut.close();
                    bm.recycle();

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }


            index++;
            if (index < count) {
                loadWebView()
            }


        }

    }