Search code examples
javaandroidbitmapandroid-asynctasksurfaceview

SurfaceView flickering when scrolling


I have a scrollview and nested several custom SurfaceView within. As I scroll, the SurfaceView background begins to flicker black. I have researched this for at least a day now and am unable to find a solution. I have tried to implement the solution of this thread: http://android-coding.blogspot.ca/2012/01/flickering-problems-due-to-double.html but found no success.

With my SurfaceView, I am trying to draw text and a downloaded image of an emoji. Initially, I used a custom view but was blocked after attempting to download a bitmap in the UI thread and recieved a NetworkOnMainThreadException. So I tried to use an AsyncTask for the entire onDraw() portion of the view. However, the View remained blank, and I was unable to update it after the AsyncTask finished. I tried to call invalidate() on the view after the AsyncTask finished but it resulted in an endless loop of onDraw(). Then I created a boolean variable to stop this loop and render the view only once, but it ended the same way I started: a blank view.

Now I am attempting to use a SurfaceView because I read

One of the purposes of this class is to provide a surface in which a secondary thread can render into the screen

and thought I should use it because I am using a seperate thread to download a bitmap.

Now that I implemented a SurfaceView, it does not work the way I want it to as it flickers black as I scroll. I have recorded it here: https://youtu.be/o5j9s4XF65E

Pastebin of faulty code here: https://pastebin.com/g61aSNM2

The questions I am asking:

  • Should I be using a SurfaceView for this purpose? If not, then what would be the proper way to implement this?

  • Should I be using a Thread instead of AsyncTask to download a bitmap from url?

  • Why is SurfaceView flickering and what can I do about it?


Solution

  • Ok, I spent some time rethinking the structure of my View and realized I should not be using SurfaceView.

    I made my CustomView, TextMessage, extend ImageView and during onDraw() I called my custom AsyncTask<TextMessage, Void, Bitmap> which simply creates a Bitmap of what the View should be. After AsyncTask finishes, during the onPostExecute() method I called setImageBitmap(myBitmap) on the TextMessage which I first passed as the parameter.

    This is so simple I complete overthought my problem, I never should have used SurfaceView in the first place.