Рисуване върху платно с отделна нишка Android

Здравейте, опитвам се да използвам SurfaceView и Threads, за да рисувам по-бързо върху Canvas. Досега успях да рисувам върху платно, като просто разширих класа View и рисувах в метода onDraw. Освен това имам възможност да преначертая платното, ако потребителят въведе през клавиатурата (чрез предаване на клавишен код от дейност към персонализирания изглед).

Проблемът е, че съм заседнал с многопоточност, замених класа View с SurfaceView и внедрих Runnable(следвано този урок). Но не мога да предам код на клавиша, ако се е случило въвеждане на клавиш. Освен това, ако извикам метод invalidate() в персонализиран изглед, нищо не се случва. Единствената разлика от кода на урока и моя е, че добавих към края на цикъла while този ред:

retry = false;

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

view.resume();

Проблеми: -view не прави невалидни при ключови събития и не рисува нови изображения (не знам защо)

  • ако спра нишка чрез извикване на thread.join(); метод, други обекти в CustomView ще останат ли в паметта на купчината или ще бъдат унищожени?

  • как да накарам това приложение да се изпълнява автоматично при стартиране и след това да се изпълнява само при щракване?

  • защо невалидният метод не изчиства платното, ако изрично извикам преди view.resume()?

p.s. Трябва да публикувам примерни кодове, моля, уведомете ме и ще прикача git repo с тестово приложение.

Благодаря


person svarog    schedule 15.09.2017    source източник


Отговори (1)


В android имате класа Handler, който можете да внедрите за изпращане на съобщения, създавате го вътре в нишката, която искате да получите, и имплементирате handleMessage, в други нишки използвате sendMessage.

Друго нещо, за булеви флагове и многопоточност, трябва да използвате ключовата дума volatile за някои VM оптимизации.

volatile boolean retry = false;
person Marcos Vasconcelos    schedule 15.09.2017
comment
Добавих ключовата дума volatile, но нищо не се е променило. Благодаря - person svarog; 18.09.2017