ビューの可視性が GONE である場合、テキスト、バックグラウンド リソースを変更し、バックグラウンド スレッドでその中のいくつかのビューを膨張させるアプリケーションをクラッシュさせることはありますか? 私は2つのボタンでいくつかのテストを行いました.1つは表示され、もう1つは消えました。バックグラウンドスレッドで表示されているボタンのテキストを変更するとクラッシュし、GONEの可視性でボタンのテキストを変更すると、クラッシュせずに機能しました. 誰かがこれを説明できますか?
2 に答える
わかりました、私はあなたのために何かを持っています。
イベント処理とスレッド化
ビューの基本的なサイクルは次のとおりです。
イベントが発生し、適切なビューにディスパッチされます。ビューはイベントを処理し、リスナーに通知します。
イベントの処理中にビューの境界を変更する必要がある場合、ビューは を呼び出します
requestLayout()
。同様に、イベントの処理中にビューの外観を変更する必要がある場合、ビューは を呼び出します
invalidate()
。またはが呼び出された
requestLayout()
場合invalidate()
、フレームワークは、ツリーの測定、レイアウト、および描画を適切に処理します。
注:ビュー ツリー全体がシングル スレッドです。ビューでメソッドを呼び出すときは、常に UI スレッド上にいる必要があります。他のスレッドで作業を行っていて、そのスレッドからビューの状態を更新したい場合は、ハンドラーを使用する必要があります。
詳細については、 http://developer.android.com/reference/android/view/View.htmlを参照してください。
あなたの場合、あなたのビューはすでになくなっているので、ビューツリーに接続されていないと思います。
ハンドラーを作成する必要があります!
そのハンドラーにコードを配置してUIを更新し、スレッドにハンドラーを呼び出します。
どの言語でも、スレッドからUIを直接更新しないでください。プログラミングの大きなエラーです!
ハンドラーを作成する例:
static Handler updater1 = new Handler() {
@Override
public void handleMessage(Message msg) {
//your code to update the UI
}
};
スレッドからハンドラーを呼び出す例:
updater1.sendEmptyMessage(0);
スレッドからテキストを変更しようとしている動作は、すべての言語で異なる可能性があります。しかし、それは大きなエラーであることを決してすべきではありません!
可視性が「GONE」のボタンのテキストを更新しようとすると、機能しなかった可能性があります。しかし、あなたはそれを見ることができません!