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