SurfaceView мига при превъртане

Имам scrollview и вложих няколко персонализирани SurfaceView вътре. Докато превъртам, фонът SurfaceView започва да трепти черен. Проучвам това поне един ден и не мога да намеря решение. Опитах се да внедря решението на тази тема: http://android-coding.blogspot.ca/2012/01/flickering-problems-due-to-double.html, но не намери успех.

С моя SurfaceView се опитвам да нарисувам текст и изтеглено изображение на емоджи. Първоначално използвах персонализиран изглед, но бях блокиран, след като се опитах да изтегля растерно изображение в нишката на потребителския интерфейс и получих NetworkOnMainThreadException. Така че се опитах да използвам AsyncTask за цялата част onDraw() на изгледа. Изгледът обаче остана празен и не можах да го актуализирам, след като AsyncTask завърши. Опитах се да извикам invalidate() на изгледа, след като AsyncTask завърши, но това доведе до безкраен цикъл на onDraw(). След това създадох булева променлива, за да спра този цикъл и да изобразя изгледа само веднъж, но завърши по същия начин, както започнах: празен изглед.

Сега се опитвам да използвам SurfaceView, защото чета

Една от целите на този клас е да осигури повърхност, в която вторична нишка може да се визуализира в екрана

и реших, че трябва да го използвам, защото използвам отделна нишка за изтегляне на растерно изображение.

Сега, когато внедрих SurfaceView, той не работи по начина, по който искам, тъй като мига в черно, докато превъртам. Записах го тук: https://youtu.be/o5j9s4XF65E

Поставете грешен код тук: https://pastebin.com/g61aSNM2

Въпросите, които задавам:

  • Трябва ли да използвам SurfaceView за тази цел? Ако не, тогава какъв би бил правилният начин за прилагане на това?

  • Трябва ли да използвам Thread вместо AsyncTask, за да изтегля растерно изображение от url?

  • Защо SurfaceView трепти и какво мога да направя по въпроса?


person woodenwaffles    schedule 11.01.2018    source източник


Отговори (1)


Добре, прекарах известно време в преосмисляне на структурата на моя View и осъзнах, че не трябва да използвам SurfaceView.

Направих своя персонализиран изглед, TextMessage, да разширя ImageView и по време на onDraw() извиках своя персонализиран AsyncTask<TextMessage, Void, Bitmap>, който просто създава растерно изображение на това, което трябва да бъде изгледът. След като AsyncTask завърши, по време на onPostExecute() метода извиках setImageBitmap(myBitmap) на TextMessage, който първо подадох като параметър.

Това е толкова просто, че напълно преосмислих проблема си, че никога не трябваше да използвам SurfaceView на първо място.

person woodenwaffles    schedule 13.01.2018