app: [Android] don't block the main thread in Window.Do

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2020-07-24 19:17:29 +02:00
parent e381ff40d6
commit 4a9d97784f
2 changed files with 26 additions and 17 deletions
+14 -5
View File
@@ -29,16 +29,25 @@ func (w *Window) Do(f func(view uintptr)) {
}
success := make(chan bool)
for {
driver := make(chan androidDriver, 1)
driver := make(chan androidDriver)
// two-stage process: first wait for a valid driver...
w.driverDo(func() {
driver <- w.driver.(androidDriver)
})
go func() {
alive := w.driverDo(func() {
driver <- w.driver.(androidDriver)
})
if !alive {
driver <- nil
}
}()
d := <-driver
if d == nil {
// Window is dead.
break
}
// .. then run the function on the main thread using the
// driver. The driver Do method returns false if the
// view was invalidated while switching to the main thread.
window.RunOnMain(func() {
d := <-driver
success <- d.Do(f)
})
if <-success {