发现了一个奇怪的状况,我在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
Android的setXXXClickListener只是一个监听器的事件,回调是你触摸屏幕的时候产生的。test
以前一直把setXXXClickListener误认为是回调!致使子线程设置了click事件还有效果,把本身搞晕了。实际上是正确的流程,没啥问题!cli