Страница 1 из 1

Непонятное поведение onPageFinished

Добавлено: 28 янв 2014, 16:20
apollox
Добрый день,
есть WebView, в него загружается web-страница, например google.com.
Я хочу обновлять страницу например каждые 20 секунд.
При этом я хочу отслеживать onPageFinished и onReceivedError.

Код:

Код: Выделить всё

public class MainActivity extends Activity {

  Handler h;
  WebView webView;
  final String LOG_TAG = "myLogs";
  
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  	
	webView = (WebView) findViewById(R.id.webView);
	
	h = new Handler() {
		public void handleMessage(Message msg) {
			webView.loadUrl("http://www.google.com");
		}
	};
	
	h.sendEmptyMessage(0);	
	
	webView.setWebViewClient(new WebViewClient() {
		public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
			Log.d(LOG_TAG, "onReceivedError");
		}

		public void onPageFinished(WebView view, String url) {
			Log.d(LOG_TAG, "onPageFinished");
			h.sendEmptyMessageDelayed(0, 20000);
		}
	});  
  }  	
}
При запуске в логах все отображается правильно, каждые 20 секунд срабатывает onPageFinished:
01-28 13:12:05.955: D/myLogs(640): onPageFinished
01-28 13:12:27.384: D/myLogs(640): onPageFinished
01-28 13:12:48.844: D/myLogs(640): onPageFinished

Но если имитировать недоступность страницы, например вместо google.com написать заведомо несуществующий адрес, например wqfqfqwefwreqgf.com, то получается странная вещь, сразу вываливается:
01-28 13:16:41.237: D/myLogs(645): onReceivedError
01-28 13:16:41.276: D/myLogs(645): onPageFinished
01-28 13:16:41.656: D/myLogs(645): onPageFinished

то есть onPageFinished срабатывает два раза, хотя по идее должно быть так:
01-28 13:16:41.237: D/myLogs(645): onReceivedError
01-28 13:16:41.276: D/myLogs(645): onPageFinished

Более того, еще через 20 секунд видим:
01-28 13:17:01.746: D/myLogs(645): onPageFinished
01-28 13:17:02.286: D/myLogs(645): onReceivedError
01-28 13:17:02.296: D/myLogs(645): onPageFinished
01-28 13:17:02.397: D/myLogs(645): onPageFinished

Подскажите плиз, отчего такое странное поведение onPageFinished?
Получается что метод вызывается два раза подряд, несмотря на то что webView.loadUrl вызывается с 20-секундным интервалом.

Re: Непонятное поведение onPageFinished

Добавлено: 28 янв 2014, 18:08
altwin
В Android API вы можете найти:
Notify the host application that a page has started loading. This method is called once for each main frame load so a page with iframes or framesets will call onPageStarted one time for the main frame. This also means that onPageStarted will not be called when the contents of an embedded frame changes, i.e. clicking a link whose target is an iframe.
Т.е. вполне возможно, что onReceivedError запускает фрейм, метод onPageStarted срабатывает один раз а onPageFinished - два, поскольку закрывает фрейм и саму страницу. Поставьте брекпоинты и пошагово пройдите дебагером, чтобы посмотреть что и когда вызывается если очень интересно.

Re: Непонятное поведение onPageFinished

Добавлено: 28 янв 2014, 23:31
apollox
Спасибо, попробую дебаггером.