モバイルブラウザ用の独自のUIを持たない(そして持たない)WebサイトのモバイルクライアントとしてAndroidアプリを構築しています。私が選択したアーキテクチャは、ログイン ページで初期化 (loadURL) する非表示の WebView を使用し、JavaScript をロードしてログイン ページ (2 つある) にユーザー名、パスワード、およびその他の資格情報を入力します。ログインしたら、新しい URL に移動し、次のチュートリアルに従って、JavaScriptInterface を使用してページから HTML のセクションを抽出し、解析してアプリで使用します: http://lexandera.com/2009/01/ HTML から Web ビューを抽出する/
私の Webview には、3 つのメソッドを持つ JavaScriptInterface クラスがあります。
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");
この Web サイトのスクリプトは、WebView の WebViewClient.onPageFinished メソッドで実行されます。このメソッドは、現在の 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 でデバッグし、コードを 1 ステップ実行すると、毎回完全に機能しているように見え、すべてのページ ナビゲーションが機能し、JavascriptInterface メソッドが呼び出されます。
ここで考慮すべきスレッドまたは競合状態の問題はありますか? これを設計するための、より信頼性が高く、かつ/またはより簡単な方法はありますか?