滚动时SurfaceView闪烁

时间:2018-01-11 06:05:59

标签: java android bitmap android-asynctask surfaceview

我有一个scrollview并嵌套了几个自定义SurfaceView。当我滚动时,SurfaceView背景开始闪烁黑色。我已经研究了这个至少一天,但我找不到解决方案。我试图实现这个线程的解决方案:http://android-coding.blogspot.ca/2012/01/flickering-problems-due-to-double.html但没有成功。

使用我的SurfaceView,我正在尝试绘制文本和下载的表情符号图像。最初,我使用了自定义视图,但在尝试在UI线程中下载位图并收到NetworkOnMainThreadException后被阻止。所以我尝试使用AsyncTask作为视图的整个onDraw()部分。但是,视图仍然是空白的,我在AsyncTask完成后无法更新它。我试图在AsyncTask完成后调用视图上的invalidate(),但它导致了onDraw()的无限循环。然后我创建了一个布尔变量来停止这个循环并只渲染一次视图,但它的结束方式与我开始时相同:空白视图。

现在我正在尝试使用SurfaceView因为我读了

  

本课程的目的之一是提供一个辅助线程可以在屏幕中呈现的表面

并认为我应该使用它,因为我使用单独的线程来下载位图。

现在我实现了一个SurfaceView,它不能按照我想要的方式工作,因为当我滚动时它会闪烁黑色。我在这里录了它:https://youtu.be/o5j9s4XF65E

这里有错误代码的Pastebin:https://pastebin.com/g61aSNM2

我提出的问题:

  • 我应该为此目的使用SurfaceView吗?如果没有,那么实现这个的正确方法是什么?

  • 我应该使用Thread代替AsyncTask从网址下载位图吗?

  • 为什么SurfaceView会闪烁,我该怎么办呢?

1 个答案:

答案 0 :(得分:0)

好的,我花了一些时间重新思考我的视图结构,并意识到我不应该使用SurfaceView

我制作了自定义视图,TextMessage,扩展了ImageView,在onDraw()期间,我调用了我的自定义AsyncTask<TextMessage, Void, Bitmap>,它只创建了一个视图应该是的位图。 AsyncTask完成后,在onPostExecute()方法中,我在setImageBitmap(myBitmap)上调用TextMessage,我首先将其作为参数传递。

这很简单,我完全颠覆了我的问题,我从来不应该首先使用SurfaceView