java调用js函数的时候出现没有反应的情况,最后发现问题是:
android调用js的代码需要在主线程中执行,所以用mainlooper的handle.post之后就可以执行了。
而js调用安卓原生方法,原生方法内部如果需要操作ui的话,需要runmainThread(),需要在主线程中更新UI。
之所以这样设计是因为在messageQueue中消息是串行执行的,可以保证设置界面的过程是可控的,且符合设置预期的,不至于最后的样子不是和我们想象结果一致,多线程更新UI并不能保证事件的先后,所以必须要在队列中依次执行。
由viewRootImp中invalidate()函数中会调用cheakThread,检查是否是主线程,因此在更新UI的时候需在主线程中。
view,invalidate()=>view.invalidateInternal()=> view.的继承的viewparent.invalidateChild(this, damage)=>do while{ paren= parent.getparent;} 一直向上获取parent直到 viewRootImp
viewRootImp也是继承子viewParent,所以就会调用viewparent.invalidateChild(this, damage)
可以看出来,接下来就是调用的postScheduleTraversal()进行布局重绘操作。
可以看出来只要重绘就会检查checkThread()。