OnPageFinished не стрелять правильно при рендеринге веб-страницы

По какой-то причине onPageFinished увольняется, прежде чем WebView завершит загрузку – я не могу понять, почему …

public class WebViewClientTest extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final WebView webview = (WebView) findViewById(R.id.webview); webview.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(webview, url); webview.scrollTo(0, 500); } }); webview.loadUrl("http://www.google.co.uk/search?sourceid=chrome&ie=UTF-8&q=lala"); } } 

Хорошо, хорошо, похоже, это не исправлено. Я думаю, что при загрузке страницы происходит гоночное состояние, но не может получить воспроизводимое поведение.

Я сохраняю HTML-содержимое веб-страницы в базе данных SQLite для просмотра в автономном режиме. Я перезагружаю содержимое в WebView с помощью:

 webView.loadDataWithBaseURL("fake://fake.com/", htmlBody, "text/html", "utf-8", null); 

Похоже, что иногда, когда WebView загружает, он корректно запускает метод WebViewClient.onPageFinished (), а в других случаях – нет. Иногда он срабатывает до того, как страница закончила загрузку, создавая contentHeight 0 и игнорируя любые вызовы scrollTo.

У кого-нибудь есть опыт?

У меня был проект с кодом, который должен был запускаться только после того, как веб-просмотр отобразил его содержимое, и, как и вы, onPageFinished () не работал. Он выстрелил слишком быстро, прежде чем веб-просмотр действительно отобразил страницу.

Вместо этого мне пришлось использовать «PictureListener», который запускается, когда веб-просмотр фактически обновляет экран.

Вы используете его так:

 mWebView.setPictureListener(new MyPictureListener()); //... and then later on.... class MyPictureListener implements PictureListener { @Override public void onNewPicture(WebView view, Picture arg1) { // put code here that needs to run when the page has finished loading and // a new "picture" is on the webview. } } 

У меня была такая же проблема, чтобы отклонить мой progressdialog при рендеринге моей веб-страницы. Я решил с onPageStarted. Надеюсь, это решение поможет вам.

  @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); progressBar.dismiss(); } @Override public void onPageStarted(WebView view, String url, android.graphics.Bitmap favicon) { if (!progressBar.isShowing()) { progressBar.show(); } }; 

Хм, хорошо, если я создаю свой собственный частный класс, он работает …

 private class ViewStoryWebViewClient extends WebViewClient { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(webView, url); webView.scrollTo(0, 50); } } 

Я получаю то же самое с loadDataWithBaseURL() . Иногда содержимое не отображается, а contentHeight равно 0. Странно, что щелчок в любом месте веб-представления приведет к отображению содержимого. Кроме того, если вы вызываете zoomIn();zoomOut(); В onPageFinished() появится страница.

EDIT: Проблема с моим кодом заключается в том, что содержимое HTML содержало фиктивное имя window.location = в событии onload, и это приводило к тому, что исходное содержимое не загружалось в произвольное время. Извините, я не думаю, что это связано с тем, что вы видите.