Предоставление веб-просмотров Android для растрового изображения, html5 javascript, проблемы с обратным вызовом

У меня есть активность с кнопкой и изображением и веб-просмотром. Моя цель – загрузить страницу, затем выполнить javascript, чтобы рисовать графику с помощью HTML5 и т. Д.

Высота изображения, нарисованного html5, неизвестна / изменена, но ширина всегда должна совпадать с шириной окна браузера или браузера.

У меня есть интерфейс javascript для получения обратного вызова, содержащего информацию, которая теперь завершила вызов функции рисования, и она дает мне высоту.

Вот настройка веб-представления

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

И кнопка, которую я имею в виду, я использовал, чтобы инициировать рендеринг моего веб-представления к текстуре с помощью этой функции:

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

Это работает. Нажатие кнопки приводит к рисованию содержимого текстуры, и изображение имеет правильный результат. Единственный каваэт – мне нужно подождать, пока страница не загрузится / нарисована, прежде чем нажимать кнопку.

Теперь я выполнил обратный вызов, который я получаю от javascript следующим образом:

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

И каждый раз эта функция обратного вызова отображает белую страницу. Самое смешное в том, что если я физически нажимаю кнопку рендеринга на текстуру, как только я вижу, что этот вызов вызван, он показывает ожидаемый результат. Происходит ли это runOnUiThread?

Сон – это то, что я добавил, чтобы увидеть, была ли какая-то забавная задержка рендеринга webview и обратный вызов, который я получаю от javascript.

Я также попытался переместить сон в runOnUiThread, что тоже не помогло.

Надеюсь, кто-то знает, в каком направлении я должен искать решение этой проблемы. Любая помощь приветствуется.

Нашел решение, которое должно было изменить renderCoupon на это:

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

И, конечно же, я удалил сон в своем обратном вызове. Благодаря моему коллеге, который рассказал мне об этом. 🙂

Intereting Posts
Как программно свернуть приложение для Android? Xamarin Android App crash: System.ArgumentException'jobject 'не должен быть IntPtr.Zero. Случайная авария приложения Как получить значок соответствующего файла в Android? Добавление дочернего элемента в родительский элемент на кнопке Нажмите Xamarin.forms Остановить удаление приложения Eclipse DDMS не показывает содержимое sdcard Классы модели Realm должны либо расширить RealmObject, либо реализовать RealmModel, чтобы считаться допустимым классом модели Почему так много приложений для Android используют NDK? Как ограничить EditText, чтобы принимать только буквенно-цифровые символы Четкое объяснение сообщения OutOfMemoryError Android.widget.LinearLayout не может быть добавлен в android.widget.TextView Помощник IAB не настроен. Невозможно выполнить операцию: queryInventory В чем разница между ANR и сбоем в Android? Как найти анимацию закончена игра в android Android SQLite R-Tree – как установить модуль?