3

ここにあるAndroid開発者ガイドを引用すると、

さらに、AndoidUIツールキットはスレッドセーフではありません。したがって、ワーカースレッドからUIを操作しないでください。UIスレッドからユーザーインターフェイスに対してすべての操作を行う必要があります。

ウィジェットがスレッドセーフではないというのはどういう意味ですか?UIスレッドからボタンの名前を変更したときにアプリケーションがクラッシュする原因。UIスレッドのイベントキューがあることは理解していますが、別のスレッドがこのキューでどのように問題を引き起こすのですか?周りを見回してみたところ、どこでもできないと書いてありましたが、理由はありませんか?

4

1 に答える 1

3

ドキュメントにUIツールキットがスレッドセーフではないと記載されている場合、これは、UIオブジェクトへのすべてのアクセスが単一のスレッドから行われると想定するようにUIツールキットが作成されていることを意味します。この仮定を行うことにより、UIツールキットの実装者は、データの破損を恐れることなく、すべてのUIオブジェクトに非同期アクセスを行うことができます。これにより、UIツールキットの実装とテストが容易になり、UIツールキットのパフォーマンスが向上します(オブジェクトを操作する前にオブジェクトをロックする必要がないため)。

UIツールキットは、メインスレッド(別名「UIスレッド」)でのみ実行されるように設計されています。別のスレッドからUIコンポーネントにアクセスすると、UIツールキットのオブジェクトが破損するリスクがあります。これを行わないようにするために、UIツールキットの設計者は次の2つのことを行います。

  • 彼らは、メインスレッドの外部からUIツールキットにアクセスすることは想定されていないことをドキュメントに書き込みます
  • UIツールキットの一部(すべてではない)のメソッドは、メインスレッドの外部からアクセスしているかどうかを確認し、そのような状況で例外をスローします

ただし、これにより、別のスレッドからUIツールキットに強制的にアクセスできなくなるわけではありません。実際、悪い副作用なしに、ボタンのテキストを別のスレッドから変更できる可能性があります。そうは言っても、あなたはまだそれをすべきではありません。クラッシュが発生する場合もあるため、UIに加えた変更が上書きされたり、無視されたりする場合もあります。

これが理にかなっていることを願っています。

于 2012-10-12T08:04:54.800 に答える