2012-01-05 11 views
1
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mTextView = (TextView) findViewById(R.id.text); 

    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      mTextView.setText("Hello"); 
     } 
    }).start(); 

しかし、私はスレッドのためにそれをdoesntの仕事のための遅延を追加します。私はUIのスレッドからUI要素を操作することができます。誰も私のためにこの状況を明確にすることはできますか? }バックグラウンドスレッドからUI要素を操作できるのはなぜですか?

+1

私は質問が何であるか分かりません。 –

+0

彼は[非メイン]スレッドでTextViewsテキストを設定するときにクラッシュしない理由を知りたいと思っています。 – AedonEtLIRA

+0

あなたは正しいです。上記のコードは、UIスレッドからではなくTextViewのテキストを設定する場所で動作するのはなぜですか? – drifter

答えて

3

Androidでは、実際にメインスレッド外からUIを更新することはありません。それはちょうど時間の爆弾を打っている。メインのUIスレッドがその時点でUIを更新していない場合、スレッドはそれを実行できます。 SurfaceViewの外部で発生するタイミングを制御する方法はありません。

少なくともそれは私の理解でした。私は確かに100%知っているわけではありませんが、以前はメインのUIスレッドの外からUIを(偶然に)更新することができました。時にはうまくいくことがあり、時にはそうではないかもしれないので、私はそれが何らかの形のConcurrentModificationExceptionであると仮定します。

+0

これはうまく動作しないと私は気づいていませんでした。これは難しくて速い(強制的な)ルールであると私は理解していました。情報をありがとう。私はまだ、あなたがテスト中にあなたのために働く場合でも、異なるスレッドからUIを変更することを選択しないことを強くOPに示唆しています。異なるデバイスで、または異なる状況下で失敗する可能性があります。 – FoamyGuy

+0

これは、それ以降のOSバージョンでは高速フェイルになる可能性がありますが、以前にやったことが分かりました。 – DeeV

+0

UIを更新する機会が見つかるまで、睡眠中のものをループで囲んでみましたか(これはそれを証明します)? –

1

いいえ、UI要素を操作する場合は、メインスレッドから行う必要があります。

+0

しかし、上記のコードは動作します。 UIのスレッドからTextViewのテキストを変更することはできません。 – drifter

関連する問題