0

別のスレッドからの UI の更新は禁止されていることを知っているので、アプリケーションからどのような結果が得られるかを試してみました。はい、UI コンポーネントを更新するとアプリがクラッシュしますが、よくわからないケースが 1 つあります。アプリは問題なく動作します。

1)

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        tv = (TextView)findViewById(R.id.textView1);
        bt = (Button)findViewById(R.id.button1);

        new Thread(){ //1                       
            public void run() {                             
                tv.setText("changed");                      
        }}.start(); //1  }  
    }

2)

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        tv = (TextView)findViewById(R.id.textView1);
        bt = (Button)findViewById(R.id.button1);

        bt.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View arg0) {
                 new Thread(){ //1                       
                        public void run() {                             
                            tv.setText("changed");                      
                    }}.start(); //1  }  
            }

        });


    }

私の問題についての以前の説明で申し訳ありませんが、ほとんどの人が誤解していると思うので、質問を言い換えます。上記の 2 つのシナリオがあります。新しいスレッドの作成と UI コンポーネントの更新の両方でクラッシュ エラーが発生するはずですが、実際には 2 つ目のシナリオのみがクラッシュしますが、最初のシナリオはクラッシュしません。理由を知っている人はいますか?

4

3 に答える 3

2

この例外を確認してください

E/AndroidRuntime( 7652): FATAL EXCEPTION: Thread-19449
E/AndroidRuntime( 7652): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
E/AndroidRuntime( 7652):    at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4357)
E/AndroidRuntime( 7652):    at android.view.ViewRootImpl.invalidateChild(ViewRootImpl.java:802)
E/AndroidRuntime( 7652):    at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:851)
E/AndroidRuntime( 7652):    at android.view.ViewGroup.invalidateChild(ViewGroup.java:4312)
E/AndroidRuntime( 7652):    at android.view.View.invalidate(View.java:8603)
E/AndroidRuntime( 7652):    at android.view.View.invalidate(View.java:8554)

UI スレッド チェックは、無効化 (レンダリング) 時にのみチェックされます。
したがって、作成時(onCreate)では問題ありません。

setText の前に Thread.sleep(5000) を追加すると、上記の例外が発生します。

于 2012-04-24T03:23:33.030 に答える
0

この種の操作には、スレッド化の代わりにasynctaskを使用します。すべてここで説明されており、非常に使いやすいです。

于 2012-04-24T03:13:21.983 に答える
0

これをチェックしてください

private void startthread() {
anihandler = new Handler() {

@Override
public void handleMessage(Message msg) {
    super.handleMessage(msg);

     tv.setText("changed");
}

};

aniThread = new Thread() {
  public void run() {
 sleep(1000);
                 anihandler.sendMessage(anihandler
                        .obtainMessage());


}
};

aniThread.start();
}
于 2012-04-24T03:08:57.997 に答える