我正在使用Matrix在屏幕上旋转PNG图像。我想将旋转操作移动到一个单独的线程,因此UI线程不会负担它。但这引发了一些有趣的问题。
一旦将Matrix应用于ImageView,我预计需要调用invalidate()。但是,旋转的图像在屏幕上显得很好 - 我从不调用invalidate()。没有触摸区域,我正在做的任何事情都没有明确告诉UI刷新屏幕。是什么刺激UI线程更新显示? UI线程是否神奇地“知道”显示需要更新(因此不需要显式调用invalidate())因为IT是触摸作为显示一部分的对象的线程?
当我将旋转移出UI线程时,我将操纵UI用于渲染屏幕的相同ImageView。这听起来像是需要同步的经典线程冲突问题(因为多个线程将访问同一个对象)。但由于上述行为,我不确定如何处理。由于UI线程似乎“神奇地知道”屏幕需要更新,我是否需要同步 - 或者单独的线程是否只是在视图上调用invalidate()并且会处理它?</ p>
谢谢!
答案 0 :(得分:2)
我相信它是来自非UI线程的postInvalidate()
,而不是{UI}线程上的invalidate()
。
但是是的。
只需打电话给它,它会在下一次机会时更新。
答案 1 :(得分:0)
您不必调用invalidate的原因是ImageView的setImageDrawable
(和类似方法)方法已经使自身无效。
此外,在单独的线程中修改视图是个坏主意。将视图操作移动到onPostExecute
并将位图操作保留在doInBackground
。