Perché non tutti i metodi di controllo dell'interfaccia utente RunOnUIThread

3

Sia in .NET che in Android e sono sicuro che in altri framework ho notato questo problema in cui si finisce con un'attività che richiede troppo tempo e quindi mantiene il thread dell'interfaccia utente.

Supponiamo che tu abbia un metodo che aggiorna un'etichetta con testo da un percorso di rete / Internet e ritorna dopo 3-4 secondi e imposta l'etichetta in modo appropriato. Questo contiene il thread dell'interfaccia utente. Quindi il tuo primo punto di riferimento è quindi spostare la chiamata al metodo su un thread diverso. Solo che non funziona solo ... perché non puoi più aggiornare il testo dell'etichetta dato che ciò può essere fatto solo nel thread dell'interfaccia utente ....

Quindi la lingua fornisce qualcosa sulla falsariga di

      runOnUiThread(() -> {
       label.setText(myNewFoundInformationFrom);
});

Questo esempio è di Android che utilizza lambda e rappresenta senza dubbio un enorme miglioramento su ciò che avremmo potuto utilizzare 10 anni fa ...

Forse più in là ti ritrovi a farlo da diversi punti ... quindi potresti creare un metodo

void setLabelText(string newText)
 runOnUiThread(() -> {
    label.setText(newText);
    });

e almeno nel caso di Android ... questo funziona indipendentemente dal thread da cui lo eseguo.

Quindi questo mi fa meraviglia ... Perché Microsoft / Google e tutti fanno in modo che tutti i metodi di aggiornamento / le funzioni per i controlli dell'interfaccia utente siano già sicuri che vengano eseguiti dal thread dell'interfaccia utente in questo modo - in modo che non dobbiamo?

    
posta Chris Nevill 09.01.2015 - 13:00
fonte

2 risposte

1

Esistono alcune preoccupazioni che potrebbero impedire un approccio di tipo InIiThread sempre eseguito.

Il problema principale è che se ti trovi in un thread non dell'interfaccia utente, le tue operazioni vengono rimandate perché vengono pubblicate su una coda, quindi non hai idea di quando le tue azioni diventeranno effettive. Se hai diverse modifiche che devono avere effetto nello stesso momento, devi raggrupparle in una funzione / lambda e pubblicarle come al solito, altrimenti un altro thread potrebbe riuscire a inserire un'attività registrata tra le tue attività.

Questo ha un analogo nella sincronizzazione delle risorse, dove è incredibilmente comune che è necessario eseguire diverse operazioni sotto lo stesso blocco.

Le funzioni sincrone sono importanti, poiché a volte devi sapere che il risultato è stato bloccato prima di continuare.

    
risposta data 09.01.2015 - 16:17
fonte
1

Quando vuoi cambiare solo un'etichetta, non c'è problema con la soluzione che hai suggerito. Ci sono, tuttavia, almeno due scenari, in ciò che questo ha senso:

  1. Sincronizzazione. Di ', vuoi aggiornare un testo del pulsante e abilitarlo / disabilitarlo. Con runOnUiThread, non c'è bisogno di sincronizzazione o blocco espliciti.
  2. Aggiornamento collettivo. Se si stanno aggiornando molti elementi, chiamare runOnUiThread per ogni elemento danneggerebbe le prestazioni. (Bene, se c'è una quantità orribile di articoli, dovresti dividerli in diversi lotti.)
risposta data 09.01.2015 - 17:05
fonte

Leggi altre domande sui tag