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,所以我无法理解为什么这段代码有效。请告诉我为什么这段代码有效。

但是当我在线程中吐司时它开始崩溃,所以我的问题是为什么从线程更新 textview 是有效的。

谢谢

4

1 回答 1

0

您不能从后台线程更新 ui。使用runOnUIThread.

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

从文档中引用

每个应用程序都有自己的特殊线程来运行 UI 对象,例如 View 对象;这个线程称为 UI 线程。只有在 UI 线程上运行的对象才能访问该线程上的其他对象。

于 2013-09-26T14:01:02.330 回答