Использование 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 вызываются.
Есть ли какая-то проблема с нитью или состоянием гонки, которую следует рассмотреть здесь? Есть ли лучший, более надежный и / или более простой способ создать это?