老师你好,有个问题想要请教一下
你在这篇文章里面提到了 异步创建
我尝试在子线程调用了如下代码,没按照文中的说法替换子线程 Looper的MessageQueue
View v = new View(MainActivity.this);
v.invalidate();
v.setLayoutParams(new ViewGroup.MarginLayoutParams(200, 200)); v.setBackgroundColor(Color.RED);
然后在主线程中添加到LinearLayout !代码正常运行,界面也正常显示。
查看源码之后,检查线程是在ViewRootImpl中做的,而这个方法会在view invalidate 以后调用,我在子线程中调用的时候,因为还没有添加到 LinearLayout 中,所以不会触发ViewRootImpl 中方法的调用。 (翻了一下 5.0 和 8.0 的源码)
那么你在文章中提到的 替换子线程的消息队列作用是什么呢?
分割线---------------
但是上面不替换消息队列的情况对WebView 不起作用,子线程创建WebView的时候必须替换。
替换成之后,WebView 可以正常创建的了
然而在主线程中添加到布局容器时候还是提示在非UI线程操作了View. 不知道老师使用这种方法的时候有没有遇到类似的问题。
再割-----------------
关于这个问题在stackoverflow上也有个类似的提问~
https://stackoverflow.com/questions/5284513/constructing-views-in-a-non-ui-thread-and-consuming-in-the-ui-thread
展开