3

モバイルブラウザ用の独自の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 メソッドが呼び出されます。

ここで考慮すべきスレッドまたは競合状態の問題はありますか? これを設計するための、より信頼性が高く、かつ/またはより簡単な方法はありますか?

4

0 に答える 0