Autore Topic: setContentView che ritarda la comparsa del layout...  (Letto 442 volte)

Offline Qwertid

  • Utente junior
  • **
  • Post: 50
  • Respect: 0
    • Mostra profilo
setContentView che ritarda la comparsa del layout...
« il: 19 Dicembre 2011, 18:30:42 CET »
0
Ciao a tutti!  :-)

Sto incontrando in diverse activity un problema comune e piuttosto fastidioso: all'inizio di ciascuna di essere c'è la chiamata setContentView per mostrare il layout del file xml associato. Dopo questa istruzione inizializzo varie campi istanza della classe ed effettuo operazioni di routine (es: findViewById).

Soltanto alla fine comincio ad eseguire delle chiamate ad un motore di Text-To-Speech e di ASR in locale (dispongo delle librerie).

Il problema è che quando avvio l'activity lo schermo rimane nero e non compare il layout xml mentre ascolto ciò che il TTS ha da dire... Quando tutte le chiamate al TTS e all'ASR sono esaurite finalmente il layout compare...

Come posso fare ad evitare questa problematica? Come "dare il tempo" alla setContentView di mostrare la grafica prima che continui con l'esecuzione del codice che è nell'activity?


Grazie a tutti quelli che vorrano rispondermi  ;-)

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:setContentView che ritarda la comparsa del layout...
« Risposta #1 il: 19 Dicembre 2011, 18:39:12 CET »
+1
Se ho ben capito la natura del problema, dovresti togliere dall'onCreate le operazioni che hanno una durata non trascurabile e/o non predicibile, e spostarle in un thread a parte (che fai partire ad esempio alla fine della onCreate), così hai l'UI subito pronta mentre il TTS finisce il suo lavoro.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Qwertid

  • Utente junior
  • **
  • Post: 50
  • Respect: 0
    • Mostra profilo
Re:setContentView che ritarda la comparsa del layout...
« Risposta #2 il: 19 Dicembre 2011, 19:05:05 CET »
0
Mettiamo il caso in cui in questo nuovo thread che creo vada a finire anche l'invocazione ad un metodo che mediante il meccanismo del pattern observer modifichi qualche elemento della UI. Posso avere problemi di fronte ad uno scenario simile?

Grazie!!!

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:setContentView che ritarda la comparsa del layout...
« Risposta #3 il: 19 Dicembre 2011, 19:28:16 CET »
0
Tutto ciò che "tocca" la UI deve essere eseguito nel thread della UI, cioè nel thread principale (quello di cui fa parte la onCreate per intendersi).

Se un altro thread deve cambiare qualcosa nell'interfaccia grafica, lo notifica (esempio con messaggi) al thread della UI, il quale si occupa di eseguire l'operazione. Nella sezione tutorial-multithreading, ci sono alcuni esempi di scambio messaggi tra thread e UI-thread. Se la comunicazione avviene usando variabili condivise, allora devi gestire la sincronizzazione dell'accesso alle stesse.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Qwertid

  • Utente junior
  • **
  • Post: 50
  • Respect: 0
    • Mostra profilo
Re:setContentView che ritarda la comparsa del layout...
« Risposta #4 il: 20 Dicembre 2011, 12:06:36 CET »
0
Immaginavo dovessi avere a che fare con gli AsyncTask  :-) Dovrò prenderci la mano prima o poi....

La mia situazione è dunque la seguente allo stato attuale delle cose: il thread UI chiama

Codice (Java): [Seleziona]
app.execCommand(Comando1);
Il metodo execCommand al suo interno chiama il metodo ASR per avere input vocale dall'utente (l'ASR gira in un thread a parte).
Dopo avere ottenuto il valore della stringa da parte dell'utente, mediante il meccanismo observer/observable aggiorno una struttura dati e notifico agli osservatori.

Codice (Java): [Seleziona]
               
this.username = username;
setChanged();
notifyObservers(new String(username));

Allo stato attuale questo funziona ma presenta il problema che ho descritto nel primo post. Adesso con un AsyncTask come dovrei procedere? Devo "smontare" tutto l'approccio che ne ho dato e scrivere il codice praticamente dall'inizio?

Grazie  :-)

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:setContentView che ritarda la comparsa del layout...
« Risposta #5 il: 20 Dicembre 2011, 12:24:48 CET »
0
Ho difficoltà ad aiutarti perchè non conosco l'ASR, non so come è fatto il tuo codice e a dirla tutta ho una conoscenza molto superficiale dei pattern tipici.

Tuttavia, la mia impressione è che se dal thread di UI chiami un metodo (a quanto pare lo chiami nella onCreate), quel metodo viene eseguito nel thread di UI, per cui blocca il thread di UI (anche se poi parli di un thread a parte).

L'ideale sarebbe che dalla UI tu mandi un messaggio al thread che si occupa di fare tutto e che alla fine risponde al thread di UI con un altro messaggio. Il thread "lavoratore" puoi farlo con un AsyncTask o con un Thread, questo dipende da te. Se ho compreso bene quanto hai spiegato, al posto dei messaggi puoi usare il meccanismo che hai scelto, ma questo non toglie l'obbligo di chiamare i metodi "onerosi" in un thread a parte.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store