Android 从非UI线程调用textView.setText时没有错误。为什么?

Android 从非UI线程调用textView.setText时没有错误。为什么?,android,Android,我编写了下面的代码,它基本上启动了一个线程,文本视图的文本从该线程更改 我预期会出现错误,因为我从主线程以外的另一个线程访问TextTiew(UI元素) 但它很好用。我认为就我所知这是不可能的。 我不明白,我错过了什么 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(s

我编写了下面的代码,它基本上启动了一个线程,文本视图的文本从该线程更改

我预期会出现错误,因为我从主线程以外的另一个线程访问TextTiew(UI元素)

但它很好用。我认为就我所知这是不可能的。
我不明白,我错过了什么

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView tv = (TextView) findViewById(R.id.view1);
        tv.setText(Thread.currentThread().getName());

        Thread theThread = new Thread(new aRunnable(tv));
        theThread.start();      
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

say
不会从UI线程外部访问Android UI工具包。
他们不会说Android本身包含任何阻止您访问的代码。这只是一个可能产生意想不到的副作用的坏主意


你应该调用
Activity.runOnUiThread()
从其他线程更新UI。

我假设
aThread
真的是
ARunnable
?@Bob如果你检查这段格式不好的代码,你会发现他做的与你做的类似,对他来说它崩溃了。这让我更加困惑。我也是^^有人能运行我的代码来测试它是否崩溃吗?我在三星Note10.1上运行它,输出是主线程-1205@SimonBob正如我在下面指出的,Android不一定一致地执行此检查。尽管如此,即使跨线程UI调用没有抛出,这也是一个坏主意。文档(链接在下面)明确指出UI类不是线程安全的。他们并没有说,如果你做错了,Android会抓住你。很有可能是不同版本的Android,甚至是不同设备的实现变化改变了UI方法将抛出的内容。@j\u\m谢谢您的解释。我知道这不是我想要的方式。我想玩一下处理程序,只是弄不明白为什么它不会在没有…的情况下崩溃。事实上,如果您尝试在主线程之外修改视图,它将引发异常。当我尝试在异步任务中访问ImageView时,出现运行时错误,说我不允许。我认为所有UI元素都会发生这种情况。应该使用handler来设置文本。据我所知,只有内部类ViewRootImpl包含这样的检查。任何不接触ViewRootImpl的UI代码都不会抛出异常,但它仍然不是线程安全的。请参阅j_m对该问题的评论
public class ARunnable implements Runnable{     
    TextView tv;    
    public ARunnable(TextView tv){
        this.tv = tv;
    }   
    @Override
    public void run() {
        tv.setText(tv.getText()+"----" + Thread.currentThread().getName()); 
    }

}