Использование WebView для многостраничного входа на сайт и получения данных

Я создаю приложение для Android в качестве мобильного клиента для веб-сайта, который не имеет (и не будет) иметь собственный пользовательский интерфейс для мобильных браузеров. Моя выбранная архитектура использует скрытый WebView, который я инициализирую (loadURL) со страницы входа в систему, а затем загружаю JavaScript, чтобы заполнить страницы входа (их две) именем пользователя, паролем и другими учетными данными. После входа в систему я перейду к новому URL-адресу, а затем использую JavaScriptInterface для извлечения разделов HTML со страниц для анализа и использования в моем приложении, следуя инструкциям здесь: http://lexandera.com/2009/01/extracting-html-from-a-webview/

В моем Webview есть класс JavaScriptInterface с 3 методами:

class MyJavaScriptInterface {
  @JavascriptInterface
  public void method1(String html) { // do something }
  @JavascriptInterface
  public void method2(String html) { // do something }
  @JavascriptInterface
  public void method3(String html) { // do something }
}

а также

WebSettings ws = getSettings();
ws.setSaveFormData(false);
ws.setJavaScriptEnabled(true);
addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");

Этот сценарий веб-сайта выполняется в моем методе WebViewClient.onPageFinished моего WebView, который проверяет текущий URL-адрес и затем выполняет следующий шаг в процессе входа в систему / просмотра. т.е.

setWebViewClient(new WebViewClient() {
  @Override
  public void onPageFinished(WebView view, String url) {

  String javascript;

  if (url.contentEquals(<first login page>) {
  javascript = "javascript:document.forms['aspnetForm'].elements[<my element>].value = <email address>;";
  javascript += "document.getElementById(<id of Submit button>).click();";
  view.loadUrl(javascript);
  } 
  if (url.contentEquals(<second login page>) {
  view.loadUrl(<javascript to enter further credentials and click Submit>);
  }
  if url.contentEquals(<welcome page>) {
  view.loadUrl(<javascript to call JavaScriptInterface method1 with selected HTML>);
  view.loadUrl(<javascript to call JavaScriptInterface method2 with selected HTML>);
  view.loadUrl(<another page>);
  }
  if (url.contentEquals(<another page>) {
  view.loadUrl(<javascript to call JavaScriptInterface method3 with selected HTML>);
  }
  }

Моя проблема в том, что при запуске приложения обратный вызов onPageFinished не всегда вызывается для каждой страницы, поэтому процесс останавливается. Но когда я выполняю отладку в Eclipse/ADT и выполняю пошаговый код, он, кажется, работает идеально каждый раз, когда вся навигация по страницам работает и методы JavascriptInterface вызываются.

Есть ли какая-то проблема с нитью или состоянием гонки, которую следует рассмотреть здесь? Есть ли лучший, более надежный и / или более простой способ создать это?

0 ответов

Другие вопросы по тегам