大家讲道理2017-04-17 16:03:37
PopupWindow には Window オブジェクトが含まれていません。独自のコントロール ツリーを管理し、ウィンドウ サービスとの双方向接続を確立します。
PopupWindow は、AlertDialog のように固定位置に表示されません。アンカー コントロール オブジェクトの位置、つまりインターフェイス内の特定のコントロールの位置に依存します。ポップアップ ウィンドウを構築して表示する前に、次の操作を行う必要があります。アンカー コントロールがアンカー コントロール オブジェクトと同じ位置にあることを確認するため、ウィンドウ管理サービスは接続を確立し、ウィンドウ接続の確立は非同期プロセスです。
つまり、Activity.onCreate などの関数が呼び出されたとき、インターフェイスとウィンドウ サービスの間の双方向接続がまだ確立されていないため、この時点でポップアップ ウィンドウが構築される場合は例外となります。がスローされ、スレッドがブロックされます。
View.post() 関数を通じて送信されたメッセージは静的キューに入れることができ、通信が確立されるとキューから取り出されて実行されます。
迷茫2017-04-17 16:03:37
個人的には、オンライン情報の説明は不正確だと思います
実際、どちらのメソッドもサブスレッドの実行をブロックするものではなく、サブスレッドは必要なことを実行する必要があります
理論的にはメインスレッドです。 「ブロック」されていますが、1つは他の領域がタッチイベントを受信して応答できること、もう1つは他の領域がタッチイベントを受信して応答できないことです
タッチイベントを受信して応答できない場合は、スレッドをブロックしていると表現される可能性があります
巴扎黑2017-04-17 16:03:37
実のところ、私もよくわかりません…PopupWindow は AlertDialog よりもメイン インターフェイスの使用に影響を与える可能性が低いためです。たとえば、以前の Android バージョンでは、Spinner は AlertDialog の形式で完成しており、ダイアログ ボックスが電話画面の中央にポップアップ表示されますが、現時点では、ダイアログ ボックスが消えない限り、ダイアログ ボックスの内容を操作することしかできません。 。 Spinner の現在のバージョンは PopupWindow によって実装されており、PopupWindow 表示の外側でインターフェイス上の他の場所をクリックしてイベントをトリガーできることがわかります。
あなたの推測については、それが間違っているか、ネット上の発言に誤解があるか、記述が曖昧であると思います。