设为首页 加入收藏

TOP

android 在非UI线程更新UI仍然成功原因深入剖析(一)
2017-10-13 10:36:50 】 浏览:4097
Tags:android 在非 线程 更新 仍然 成功 原因 深入 剖析

”只能在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
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇android TranslateAnimation 顶部.. 下一篇普通广播接收者和有序广播接收者

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目