Autore Topic: Utilizzare un Toast da un thread di background  (Letto 2023 volte)

Offline noodles

  • Utente junior
  • **
  • Post: 130
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus One
  • Sistema operativo:
    Mac OS X Snow Leopard
Utilizzare un Toast da un thread di background
« il: 03 Giugno 2010, 18:24:59 CEST »
0
Qualcuno di voi si è mai trovato ad utilizzare un toast da un thread di background?

Io mi trovo nella situazione in cui mentrre la mia activity è running avvio un thread di background per salvare un file su sdcard, quando il salvataggio è terminato sempre nel thread, visualizzo un toast.

L'app crasha e mi dice che per fare ciò, il thread deve essere un Looper. Sbirciando nella rete ho visto che per rendere un thread looper si deve fare essenzialmente:
Codice (Java): [Seleziona]
public void run() {
                Looper.prepare();
               
                //qui effettuo le mie operazioni...

                //qui visualizzo il toast

                Looper.loop();
                Looper.myLooper().quit();
               
        }

Così pare funzionare, ma non capisco il significato e l'uso di questo Looper. Infatti avviando l'app in modalità debug e attivando la modalità "Thread" del DDMS, il thread che effettua questo salvataggio non muore, ma rimane wait, probabilmente perchè rimane in questo loop., infatti Looper.myLooper().quit() non viene mai eseguito. Mi ritrovo così ad avere una serie di thread in stato di wait, uno per ogni salvataggio su sdcard, cosa non buona in termini di risorse.

Cosa dovrei fare secondo voi? Terminarlo, ma come?

Rimane la domanda... ma che senso hanno questi Looper? io non li ho capiti. Mi affido alla vostra esperienza.


Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Utilizzare un Toast da un thread di background
« Risposta #1 il: 03 Giugno 2010, 19:23:44 CEST »
0
Non l'ho mai usato ma da quanto ho capito il Looper serve quando il thread deve rimanere in ascolto di messaggi provenienti da un altro thread, è per questo che rimane in attesa.

Per il tuo caso secondo me sarebbe meglio utilizzare un Handler, in questo modo:

Dichiari nella tua activity un oggetto di tipo Hanlder:

Codice (Java): [Seleziona]
private static final int MSG_SHOW_TOAST = 1;

private Handler         handler = new Handler() {

                                                                                        @Override
                                                                                        public void handleMessage ( Message msg ) {
                                                                                                switch ( msg.what ) {
                                                                                                        case MSG_SHOW TOAST:
                                                                                                                Toast.make(TuaActivity.this, "Messaggio", Toast.LENGTH_SHORT).show();
                                                                                                                break;
                                                                                                }
                                                                                        }
                                                                                };

Dentro il tuo thread chiami

Codice (Java): [Seleziona]
Message message = handler.obtainMessage( MSG_SHOW_TOAST );
handler.sendMessage( message );

E non dovresti avere problemi :)

Offline noodles

  • Utente junior
  • **
  • Post: 130
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus One
  • Sistema operativo:
    Mac OS X Snow Leopard
Re:Utilizzare un Toast da un thread di background
« Risposta #2 il: 03 Giugno 2010, 20:13:33 CEST »
0
Si ci avevo pensato anche io ad usare un Handler, ma poi ho seguito l'altra strada che mi pareva migliore. Provo anche con l'handler e vi dico.

Offline A2PLab

  • Nuovo arrivato
  • *
  • Post: 37
  • [Close The World - txeN ehT nepO]
  • Respect: +1
    • Google+
    • http://it.linkedin.com/in/giuseppemastroeni
    • a2plab
    • a2plab
    • Mostra profilo
    • A2PLab
  • Dispositivo Android:
    HTC Desire, Acer Iconia Tab a500
  • Sistema operativo:
    Ubuntu 11.04
Re:Utilizzare un Toast da un thread di background
« Risposta #3 il: 23 Giugno 2010, 19:40:17 CEST »
0
Ciao, potresti indicarmi che strada hai seguito?
sono interessato alla comunicazione tra un Service e una Activity, lasciando al service la capacità di lanciare notifiche.
[Close The World - txeN ehT nepO]

Offline Pinabello

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: +12
    • Mostra profilo
  • Dispositivo Android:
    Htc Dream Tim
  • Sistema operativo:
    Mac os X
Re:Utilizzare un Toast da un thread di background
« Risposta #4 il: 24 Giugno 2010, 16:53:58 CEST »
0
Ho avuto esattamente lo stesso problema in un gioco che stavo sviluppando, non ho il sorgente alla mano ma ho risolto in questo modo :
Codice (Java): [Seleziona]
runOnUiThread(new Runnable()
            {
                public void run()
                {
                    String toastText = getString(res, account.getDescription());
                    Toast toast = Toast.makeText(getApplication(), toastText, Toast.LENGTH_SHORT);
                    toast.show();
                }
            });

In pratica, come specifica il nome del metodo stesso, in questo modo il codice all'interno del run() viene eseguito nel thread dell'UI, nel mio caso ha funzionato perfettamente.
« Ultima modifica: 24 Giugno 2010, 16:57:34 CEST da Pinabello »

Offline A2PLab

  • Nuovo arrivato
  • *
  • Post: 37
  • [Close The World - txeN ehT nepO]
  • Respect: +1
    • Google+
    • http://it.linkedin.com/in/giuseppemastroeni
    • a2plab
    • a2plab
    • Mostra profilo
    • A2PLab
  • Dispositivo Android:
    HTC Desire, Acer Iconia Tab a500
  • Sistema operativo:
    Ubuntu 11.04
Re:Utilizzare un Toast da un thread di background
« Risposta #5 il: 24 Giugno 2010, 17:52:50 CEST »
0
Ok, grazie mille.
Ho visto che il mio problema era un altro, comunque all'interno di un Service ho visto che è possibile chiamare un Toast mettendo nel primo parametro getApplicationContext() per ottenere il contesto dell'applicazione.
[Close The World - txeN ehT nepO]