我对UI线程works的方式有一个小问题。
例如,当用户触摸屏幕上的按钮时,应用程序的UI线程会将触摸事件调度到窗口小部件,窗口小部件又设置其按下状态并向事件队列发布无效请求。 UI线程将请求出列并通知窗口小部件它应该重绘自己。
所以我理解的是Button将状态按下设置为true,但是向事件队列发布“invalidate request”是什么意思。这是否意味着按钮告诉UI线程我已将状态设置为true。为什么按钮在设置状态按下后才会自动绘制?为什么UI线程必须告诉它重绘自己?我不知道这是多少here,但它给出了一个稍微好一点的UI线程事件调度线程图。任何人都可以解释为什么Widgets调用对Dispatch队列无效,并且UI线程要求小部件重新绘制它自己?
答案 0 :(得分:0)
当Button改变状态时,显然必须重绘。不太明显的是,其他一些控件也可能需要重绘。假设我们的按钮是半透明的,然后是重绘按钮,必须重新绘制它下方的控件,然后重绘顶部的按钮。
无效请求不仅说“我需要重绘”,而且“屏幕上的这个区域需要重绘”,并且屏幕上的重绘区域可能需要(重新)绘制其他控件。
同样使区域无效允许UI线程组合重绘而不是重绘每个(可能交叉的无效区域),它将它们组合到一个区域中并执行单次重绘,从而提高用户看到的性能和UI响应性。