我有一个滚动视图,并在其中嵌套了几个自定义SurfaceView
。当我滚动时,SurfaceView
背景开始闪烁黑色。我已经研究了至少一天,但无法找到解决方案。我尝试实现此线程的解决方案:http://android-coding.blogspot.ca/2012/01/flickering-problems-due-to-double.html 但没有成功。
使用我的SurfaceView,我正在尝试绘制文本和下载的表情符号图像。最初,我使用自定义视图,但在尝试在UI线程中下载位图后被阻止并收到NetworkOnMainThreadException
。所以我尝试对视图的整个 onDraw() 部分使用AsyncTask
。但是,视图仍然是空白的,AsyncTask
完成后我无法更新它。AsyncTask
完成后,我试图在视图上调用 invalidate(),但它导致了 onDraw() 的无限循环。然后我创建了一个布尔变量来停止这个循环并只渲染视图一次,但它以我开始时的方式结束:空白视图。
现在我正在尝试使用SurfaceView
,因为我阅读
此类的用途之一是提供一个图面,辅助线程可以在其中呈现到屏幕中
并认为我应该使用它,因为我正在使用单独的线程来下载位图。
现在我实现了SurfaceView
,它没有按照我想要的方式工作,因为它在我滚动时闪烁黑色。我在这里记录了它:https://youtu.be/o5j9s4XF65E
错误代码的粘贴在这里:https://pastebin.com/g61aSNM2
我要问的问题:
-
我应该为此目的使用
SurfaceView
吗?如果没有,那么实现这一点的正确方法是什么? -
我应该使用
Thread
而不是AsyncTask
从 url 下载位图吗? -
为什么 SurfaceView 闪烁,我该怎么办?
好的,我花了一些时间重新思考我的观点的结构,并意识到我不应该使用SurfaceView
.
我制作了自定义视图,TextMessage
扩展ImageView
,onDraw()
期间我调用了我的自定义AsyncTask<TextMessage, Void, Bitmap>
,它只是创建了视图应该是什么的位图。AsyncTask
完成后,在onPostExecute()
方法期间,我在我最初作为参数传递的TextMessage
上调用了setImageBitmap(myBitmap)
。
这太简单了,我完全过度思考我的问题,我从一开始就不应该使用SurfaceView
。