3

今日、ランダムなもので遊んでいるときに何か奇妙なことが起こりました。私のコードは以下のとおりです。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final TextView textView = (TextView) findViewById(R.id.txtName);
        new Thread() {

            @Override
            public void run() {
                for(int i=0; i<100; i++){
                    textView.setText("Hello I am fine" +i);
                    textView.setTextColor(Color.RED);
//                  Toast.makeText(getApplicationContext(), "Hello I am fine", Toast.LENGTH_LONG).show();
                }
            }
        }.start();
        ((TextView) findViewById(R.id.txtName)).setText("Hello");

    }

このコードは正常に動作しますが、技術的には動作しないはずです。スレッドから UI を更新できないため、このコードが機能する理由がわかりません。このコードが機能する理由を教えてください。

しかし、スレッドで乾杯するとクラッシュし始めるので、スレッドからのテキストビューの更新が機能する理由が私の質問です。

ありがとうございました

4

1 に答える 1

0

バックグラウンド スレッドから ui を更新することはできません。を使用しrunOnUIThreadます。

   runOnUiThread(new Runnable() {
   @Override
   public void run() {
     textView.setText("Hello I am fine" +i);
     textView.setTextColor(Color.RED);
   }
  });

ドキュメントからの引用

すべてのアプリには、View オブジェクトなどの UI オブジェクトを実行する独自の特別なスレッドがあります。このスレッドは UI スレッドと呼ばれます。UI スレッドで実行されているオブジェクトだけが、そのスレッドの他のオブジェクトにアクセスできます。

于 2013-09-26T14:01:02.330 に答える