2

UIスレッドでない限り、現在のビューにアクセスできるスレッドはありません。なぜだろう?どのスレッドがビューを変更しているかが重要なのはなぜですか?それはセキュリティ上の理由ですか?これは私が使用する回避策です:

        public void doLayout()
        {
            Runnable run = new Runnable()
            {
                public void run()
                {
                    ViewerActivity.setContentView(R.layout.main);
                }
            };

            handler.post(run);
        }

        private Handler handler;'

レイアウトを変更するたびにそれを行うのはちょっと面倒です。別の回避策はありますか?私は非同期タスクについて知っていますが、それを使用するための良い方法を見つけられませんでした、それは私がしていることよりも優れていますか?関連するすべての回答が適用されます!

4

3 に答える 3

15

はい、あなたの権利: セキュリティのために別のスレッドのビューを変更することはできません (そのため、UI スレッドと呼ばれます)。これにより、UI データが一貫性のない状態のままになると、アプリケーションがクラッシュし、デバッグが非常に難しくなる可能性があります。したがって、Android API は単純にそれを禁止しています (これは良い考えです)。これは、ほとんどの API で見られる一般的な UI パターンです。

post()またはrunOnUiThread()を使用して、任意のビューを更新できます。

anyView.post(new Runnable() {
    public void run() {
        // do update here
    }
});

なぜこのパターン?
同期は無料ではありません。パフォーマンスに影響します。そのため、同じスレッドで UI の変更を維持する方が簡単です。

異なるスレッドからデータを変更できるとしたら、何が起こりますか?
例: スレッドAがビューの色を変更Bし、同時にスレッドが色を読み取っています。マルチスレッドはどの命令が最初に実行されるかを保証しないため、予期しない結果が生じる可能性があります。色は0|0|0以前は黒 ( )でしたが、スレッドはA白 ( 255|255|255) を設定し、赤のコンポーネントを に設定することから始めました。255BA255|0|0

これは視覚効果に影響を与える単純な例ですが、非常に重要なデータでこれが発生すると、アプリケーションがひどくクラッシュし、そのようなエラーは非常に厄介でデバッグが困難になります。マルチスレッドについて学ぶことはたくさんありますが、この Java チュートリアルは良い出発点になるかもしれません...

于 2011-10-09T01:45:30.960 に答える
1

Android アプリケーションはシングル スレッド モデルを使用し、このスレッドはさまざまなイベントを UI 要素にディスパッチする役割を果たします。このシングル スレッド モデルには 2 つのルールがあります。

  1. UI スレッドをブロックしない
  2. UI スレッドの外部から Android UI ツールキットにアクセスしないでください。

Viewの外側を使用するスレッドを作成するUI threadと、2 番目の規則に違反します。

于 2011-10-09T02:12:11.573 に答える
1

ビューにアクセスできるスレッドはセキュリティだけではありません。主な理由は、ビューの背後にあるコードがおそらくスレッド セーフではないことです。これは、複数のスレッドが共通変数の読み取りと書き込みを行っている場合、データが破損しないという保証がないことを意味します。

スレッドセーフに関するウィキペディアの素晴らしい記事をチェックしてください。

于 2011-10-09T02:19:28.587 に答える