”只能在UI主线程中更新View“。
这句话很熟悉吧?
来来,哥们,看一下下面的例子
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
Thread.currentThread().setName("UIThread");
new LooperThread("非主线程修改").start();
}
private class LooperThread extends Thread {
private String text;
public LooperThread(String text) {
this.text = text;
}
@Override
public void run() {
Thread.currentThread().setName("OtherThread");
tv.setText(text);
}
}
代码这么写,不是逗比吗!肯定崩啊!但是,如果你试一下,你会发现,绝大多数是不会崩的。至于极少数会崩溃的原因,我一会再说。
你可能会很疑惑,不是”只能在UI主线程中更新View“吗?你这个在子线程里面更新View,为什么不会崩呢?
那么,你再看下面的代码,这样写就肯定崩
public void changeNoUI(View view) {
new LooperThread("非主线程修改").start();
}
调用的代码和上面的一样,只不过是我们是给一个Button设置了点击事件,然后自己手动调用的,这样就肯定会崩溃,报什么错呢?
报下面的错
02-02 16:44:38.786: E/AndroidRuntime(17907): FATAL EXCEPTION: OtherThread
02-02 16:44:38.786: E/AndroidRuntime(17907): Process: com.example.demo, PID: 17907
02-02 16:44:38.786: E/AndroidRuntime(17907): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
02-02 16:44:38.786: E/AndroidRuntime(17907): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6226)
02-02 16:44:38.786: E/AndroidRuntime(17907): at android.view