問題タブ [mutable-context-wrapper]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - ContextWrapper と Context を使用して Android WebView オブジェクトを作成するときの違いは何ですか?
問題: Android WebView 内に Web ページをプリロードし、Activity の準備が整ったときにそれを Activity にアタッチしたいと考えています。Web ページをロードするトリガー ポイントは、実際のアクティビティが作成される前です。したがって、次の方法でサービスに webview オブジェクトを作成します。
この Web ビューを表示する必要があるアクティビティが作成されたら、フレームレイアウトを作成し、子ビュー、つまりこの Web ビューを追加して、setContentView を呼び出します。このようにして、私のウェブビューはウェブページにプリロードされて表示されます。私はまた、次のことを行います
これは、上で指定したものと同じ ContextWrapper オブジェクトです。この後も、webview は、通常のユース ケースで描画できる Javascript アラートを描画しません。
私がするときでさえ
WebView は JS アラートをポップアップできません。ログに Exception タグや Fatal タグすら表示されません。WebView は、その上にウィンドウを描画できません。
これは、現在のアクティビティのコンテキストで webView を直接作成するという通常の方法で正常に機能します。
私が知っている限りでは、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 に事前に読み込み、作成時にアクティビティにアタッチするだけです。
android - Android - アプリケーション コンテキストを使用してアクティビティを作成した後、アクティビティに WebView をアタッチするにはどうすればよいですか
アプリケーションコンテキストを使用してバックグラウンドで Android WebView を作成しているため、表示する必要があるときにロードして準備ができています。必要に応じて addView を使用してアクティビティにアタッチします。これはほとんどの場合うまく機能しますが、HTML 選択ドロップダウンを開こうとするとクラッシュします。
これは、ApplicationContext を使用して WebView を作成したためだと思います。私の質問は: この問題を回避する方法はありますか? ダイアログを作成できるように、既存の WebView を別のアクティビティまたはウィンドウに「アタッチ」する方法はありますか? 実行時にコンテキストを変更して、リフレクションを使用してこれを一緒に「ハック」する方法はありますか?
編集: 以下で提案されているように、MutableContextWrapperを使用してテストしたところ、この問題をうまく解決しているようです!
android - アクティビティから別のアクティビティに渡されたときに WebView が正しく更新されない
WebView を別のアクティビティに渡す必要がありましたが、html コンテンツを 2 回読み込むことができないため、新しいアクティビティで新しい WebView を作成できませんでした。そのため、静的な黒板とMutableContextWrapperを使用して問題を解決できました。
アプローチは次のとおりです。(i) 元のアクティビティはMutableContextWrapperを使用して WebView をインスタンス化し、2 番目のアクティビティを開始する前に、(ii) 元のアクティビティから WebView を切り離し、(iii) 静的な黒板に格納します。 2 番目のアクティビティが開始され、(iv) 黒板の WebView のインスタンスが取得され、(v) MutableContextWrapperを使用してそのコンテキストが更新され、(vi) 新しいアクティビティにアタッチされます。2 番目のアクティビティが閉じられると、逆の方法で元のアクティビティに WebView が戻されます。
このアプローチはほとんどの Android バージョンで非常にうまく機能しますが、Lollipop バージョン以降、WebView は 2 番目のアクティビティにアタッチされている間はコンテンツを更新しません。ただし、2 番目のアクティビティが閉じられ、WebView が元のアクティビティに戻ると、正常に動作します。
私の研究では、Android L からの WebViews の新しい動作について発見しました。これは、描画する必要がある HTML ドキュメントの部分をインテリジェントに選択することで、メモリ フットプリントを削減し、パフォーマンスを向上させます。
そのため、この機能が WebView の更新に干渉するのではないかと疑っていましたが、enableSlowWholeDocumentDraw()メソッドを呼び出しても、WebView は引き続き正しく動作しません。
誰かがこの動作の原因を説明できるでしょうか?
android - MutableContextWrapper の安全性
MutableContextWrapper
メモリリークなどの観点から、Android はどの程度安全に使用できますか? のコンテキストで をインスタンス化しWebView
ていますがActivity
、後でそのコンテキストを別の に変更したいと考えていますActivity
。
コンテキストが混在するとリークが発生する可能性があるため、 MutableContextWrapper
forを使用することを警告する回答を次に示します。WebView
しかし、コンテキストを変更すると、どのようにリークが発生するのでしょうか? ビューが初期化されたら、ビューのコンテキストを変更してはならないのはなぜですか?
を使用して何か問題に直面した人はいますか (特に の場合WebView
)? 使用中の予防措置はありますか?そのために共有するデータはありますか?