子线程竟然能够更新UI!

1、子线程更新了UI

发现了一个奇怪的状况,我在fragment初始化的时候,new了一个子线程。而后在子线程设置了一个textView的字符串,而且设置了ta的click监听事件ide

@Override
    protected void init() {
        LogUtils.dThread("<<<<<init>>>>>>");
        testBtn = (TextView)getActivity().findViewById(R.id.test);

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                }catch (Exception e){
                    e.printStackTrace();
                }
                LogUtils.dThread("<<<<<<run>>>>>>");
                testMethod();
            }
        }).start();
    }

    private void testMethod(){
//        testBtn.setText("test更改1");
        testBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LogUtils.dThread("testMethod>>onClick");
                testBtn.setText("test更改");
            }
        });
    }

init()是fragment初始化加载的方法,注释掉的线程

//        testBtn.setText("test更改1");

是UI刷新。code

以前没有加Thead.sleep(20000);发现更新了UI!事件

以后加了就行了。字符串

缘由参考博文:https://www.jianshu.com/p/29e75093f5a2get

大体意思为:it

ViewRootImpl的建立在onResume方法回调以后,而咱们一开篇是在onCreate方法中建立了子线程并访问UI,在那个时刻,ViewRootImpl是没有建立的,没法检测当前线程是不是UI线程,因此程序没有崩溃同样能跑起来,而以后修改了程序,让线程休眠了200毫秒后,程序就崩了。很明显200毫秒后ViewRootImpl已经建立了,能够执行checkThread方法检查当前线程。io

2、Click事件

Android的setXXXClickListener只是一个监听器的事件,回调是你触摸屏幕的时候产生的。test

以前一直把setXXXClickListener误认为是回调!致使子线程设置了click事件还有效果,把本身搞晕了。实际上是正确的流程,没啥问题!cli