通过WebView循环并等待onPageFinished完成

问题描述:

我有一个问题循环浏览WebView,等待WebView完全加载,用javascript函数填充webPage的表单,然后创建一个webView的图像。通过WebView循环并等待onPageFinished完成

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"); 

} 

现在我需要等待getHtmlFromWebView传递给其他的WebView前完成执行,我需要创建的WebView的画面并将其保存的图像等

public class getDataJSForPrint{ 

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

     //got this piece of code in another answer of * 
     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(); 
      } 
     } 


    } 

} 

我试图把

synchronized (object) { object.wait(); } 

loadUrl后,并试图通知它在getHtmlFromWebView结束但显然它不起作用。

如何在FOR循环转到下一个项目之前等待getHtmlFromWebView完成?

谢谢:)

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

//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 * 
      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() 
      } 


     } 

    } 
+0

我想你的代码,但getHtmlFromWebView不会被调用,试图把周围的断点似乎忽略了Java/JavaScript方法:(,我现在会检查我的代码中的错误(我想它非常快) – MatPag 2014-08-28 14:07:20

+0

ooook,我找到了一个解决方案,是我的一些代码行的错误,非常感谢你,递归是这样的:D – MatPag 2014-08-28 14:38:55