Rendering Android webview to bitmap, html5 javascript, problème de rappel

J'ai une activité avec un bouton et une image et une vision du Web. Mon objectif est de charger une page, puis d'exécuter javascript sur elle pour dessiner des graphiques à l'aide de HTML5, etc.

La hauteur de l'image dessinée par html5 est inconnue / variable, mais la largeur doit toujours être identique à la largeur du téléphone ou à la fenêtre du navigateur.

J'ai une interface javascript pour obtenir un rappel contenant des informations qu'il a maintenant terminé d'appeler la fonction de dessin, et il me donne la hauteur.

Voici la configuration de la vue web

mWeb = (WebView) findViewById(R.id.webView1); mWeb.clearCache(true); mWeb.addJavascriptInterface(new IJavascriptHandler(), "cpjs"); mWeb.getSettings().setJavaScriptEnabled(true); mWeb.loadUrl(" http://theURL.com "); mWeb.setInitialScale(100); mWeb.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR); mWeb.setWebViewClient(new WebViewClient() { public void onPageFinished(WebView view, String url){ mWidth = mWeb.getWidth(); mHeight = mWeb.getHeight(); view.loadUrl("javascript: Tools.adjustWidth(" + mWidth + " )"); String javaCouponRender = "renderCoupon(" + kupongJson + ", 0); void(0)"; view.loadUrl("javascript: " + javaCouponRender); } }); } 

Et le bouton que j'ai à mon avis, j'ai utilisé pour lancer mon rendu web à une texture avec cette fonction:

 void renderCoupon(int width,int height){ bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); final Canvas c =new Canvas(bitmap); mWeb.draw(c); imgView.setMinimumWidth(width); imgView.setMinimumHeight(height); imgView.setImageBitmap(bitmap); imgView.setVisibility(View.VISIBLE); } 

Cela marche. En appuyant sur le bouton, rend le contenu dessiné sur la texture et la visualisation de l'image a un résultat correct. Le seul cavaet est que je dois attendre jusqu'à ce que la page soit chargée / dessinée avant d'appuyer sur le bouton.

Maintenant, j'ai implémenté le rappel que je reçois de javascript comme ceci:

 final class IJavascriptHandler { IJavascriptHandler() { } public void couponRenderedCallback(final int height){ mHasGotRenderCallback = true; mHeight = height; Toast t = Toast.makeText(getApplicationContext(), "see if it helps sleeping", 2000); t.show(); try{ Thread.sleep(5000); } catch(InterruptedException ex){ } runOnUiThread(new Runnable() { @Override public void run() { Toast t2 = Toast.makeText(getApplicationContext(), "and now we render to texture", 2000); t2.show(); renderCoupon(mWidth, mHeight); } }); } } 

Et chaque fois, cette fonction de rappel renvoie une page blanche. Ce qui est drôle, c'est que si je presse physiquement le bouton de rendu à la texture dès que je vois que ce rappel est appelé, il montre le résultat attendu. Est-ce que runOnUiThread échoue de quelque façon?

Le sommeil est quelque chose que j'ai ajouté pour voir s'il y avait une sorte de retard drôle du rendu webview et le rappel que je reçois de javascript.

J'ai également essayé de passer le sommeil dans le runOnUiThread, qui n'a pas non plus aidé.

J'espère que quelqu'un sait dans quelle direction je devais chercher à résoudre ce problème. Toute aide est appréciée.

Trouvé une solution, qui était pour changer le renderCoupon à ceci:

 void renderCoupon(final int width,final int height){ mWeb.postDelayed(new Runnable() { @Override public void run() { // TODO Auto-generated method stub bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); final Canvas c =new Canvas(bitmap); mWeb.draw(c); imgView.setMinimumWidth(width); imgView.setMinimumHeight(height); imgView.setImageBitmap(bitmap); imgView.setVisibility(View.VISIBLE); } }, 100); } 

Et bien sûr, j'ai supprimé les choses Sleep dans mon rappel. Merci à ma collègue qui m'a posé des questions à ce propos. 🙂