9

問題: Android WebView 内に Web ページをプリロードし、Activity の準備が整ったときにそれを Activity にアタッチしたいと考えています。Web ページをロードするトリガー ポイントは、実際のアクティビティが作成される前です。したがって、次の方法でサービスに webview オブジェクトを作成します。

MutableContextWrapper contextWrapper = new MutableContextWrapper(serviceContext.getApplicationContext());
this.webView = new WebView(contextWrapper);

この Web ビューを表示する必要があるアクティビティが作成されたら、フレームレイアウトを作成し、子ビュー、つまりこの Web ビューを追加して、setContentView を呼び出します。このようにして、私のウェブビューはウェブページにプリロードされて表示されます。私はまた、次のことを行います

contextWrapper.setBaseContext(CurrentActivity.this);

これは、上で指定したものと同じ ContextWrapper オブジェクトです。この後も、webview は、通常のユース ケースで描画できる Javascript アラートを描画しません。

私がするときでさえ

ContextWrapper contextWrapper = new ContextWrapper(CurrentActivity.this);
this.webView = new WebView(contextWrapper);
this.webView.loadUrl(someUrl); 

WebView は JS アラートをポップアップできません。ログに Exception タグや Fatal タグすら表示されません。WebView は、その上にウィンドウを描画できません。

これは、現在のアクティビティのコンテキストで webView を直接作成するという通常の方法で正常に機能します。

this.webView = new WebView(CurrentActivity.this);
this.webView.loadUrl(someUrl);

私が知っている限りでは、http://developer.android.com/reference/android/content/ContextWrapper.htmlは、コンストラクターで渡されたものと同じ操作を、保持している基本コンテキストに対して実行するだけです。

私のユースケースはこのようなものです。http://developer.android.com/reference/android/content/MutableContextWrapper.htmlを渡して webView オブジェクトを作成します。MutableContextWrapper は、何らかのアクティビティのコンテキストを保持するか、アプリケーション コンテキストを保持できます。WebView を表示する必要がある実際のアクティビティが開始されると、MutableContextWrapper 内でコンテキストを切り替え、フレーム レイアウトと setContentView に配置して WebView を表示します。基本的に、ページの読み込みを開始するトリガーは、アクティビティが作成される前であるため、ページを webview に事前に読み込み、作成時にアクティビティにアタッチするだけです。

4

1 に答える 1

1

メインUIスレッドからWebビューを作成しているようです(の使用に基づいてserviceContext)

Web ビューは、その内部 Handler がメイン UI スレッドにバインドされることを期待するため、これは一般的には良い考えではありません。

これに関連する他のスレッドがあります:

スレッド内の WebView を作成できません

アクティビティがロードされた後 (つまり、メソッド内) に webview をロードし、onCreate単に「ロード中」インジケータをユーザーに表示する方がはるかに優れています。setVisibilityページが読み込まれるまでwebview を ( で) 非表示にし、 WebViewClientを使用して load イベントをリッスンすることができます。

ページが読み込まれたら、webview の可視性をVISIBLE

于 2013-03-11T21:40:12.800 に答える