Autore Topic: Service o Thread?  (Letto 932 volte)

Offline guidocx84

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Service o Thread?
« il: 28 Novembre 2011, 11:14:24 CET »
0
Ciao a tutti!
Avrei bisogno di un consiglio. Ho bisogno che la mia applicazione (composta da tre activity) effettui un'operazione di download di alcune informazioni da un server con una certa periodicità ed in presenza di copertura wifi. Le informazioni che dovrebbe scaricare in background, quindi senza alcuna interazione da parte dell'utente, devono poi essere utilizzate per aggiornare delle tabelle SQLite che due activity delle tre utilizzano per fare il loro mestiere. Di thread so qualcosa.. li ho già usati in passato.. di Service sono a zero.. ma se c'è da imparare qualcosa di nuovo ben venga! Solo che non vorrei prendere la strada sbagliata visto che devo ultimare l'applicazione il prima possibile. Come mi consigliate di agire? Avete qualche codice di esempio? Grazie a tutti!  ;-)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
R: Re:Service o Thread?
« Risposta #1 il: 28 Novembre 2011, 11:23:00 CET »
0
Ciao a tutti!
Avrei bisogno di un consiglio. Ho bisogno che la mia applicazione (composta da tre activity) effettui un'operazione di download di alcune informazioni da un server con una certa periodicità ed in presenza di copertura wifi. Le informazioni che dovrebbe scaricare in background, quindi senza alcuna interazione da parte dell'utente, devono poi essere utilizzate per aggiornare delle tabelle SQLite che due activity delle tre utilizzano per fare il loro mestiere. Di thread so qualcosa.. li ho già usati in passato.. di Service sono a zero.. ma se c'è da imparare qualcosa di nuovo ben venga! Solo che non vorrei prendere la strada sbagliata visto che devo ultimare l'applicazione il prima possibile. Come mi consigliate di agire? Avete qualche codice di esempio? Grazie a tutti!  ;-)

Se devi fare delle operazioni in background assolutamente Service!

Inviato dal mio HTC Desire usando Tapatalk

Offline guidocx84

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Re:Service o Thread?
« Risposta #2 il: 28 Novembre 2011, 11:28:35 CET »
0
Citazione
Se devi fare delle operazioni in background assolutamente Service!
Ciao Ricky! Grazie per la risposta! C'è qualche tutorial/guida/codice di esempio particolare che mi consiglieresti per imparare a realizzare un service? Grazie!  ;-)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Service o Thread?
« Risposta #3 il: 28 Novembre 2011, 11:51:07 CET »
+1
Ecco a te un'applicazione "giocattolo" che fa uso di un servizio e scambia dati tramite degli ordered broadcast.
L'avevo scritto per un piccolo tutorial da pubblicare qui poi non ho avuto tempo di scrivere il testo a corredo, dagli un occhio :-)

Offline guidocx84

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Re:Service o Thread?
« Risposta #4 il: 28 Novembre 2011, 11:56:53 CET »
0
Ti ringrazio moltissimo per adesso e mi metto subito a studiare!! Grazie mille! Buona giornata!!  ;-)

Offline guidocx84

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Re:Service o Thread?
« Risposta #5 il: 29 Novembre 2011, 09:42:28 CET »
0
Ok! Sembra funzionare. Ho creato una classe MyLocalService così:

Codice: [Seleziona]
public class MyLocalService extends Service {
       
        //Tag del Log
        private final static String LOG_TAG = "MyLocalService";

        //Riferimento al Thread in background
        private BackgroundThread backgroundThread;
       
        @Override
        public void onCreate() {
                super.onCreate();
                // Facciamo partire il BackgroundThread
                backgroundThread = new BackgroundThread();
                backgroundThread.start();
        }


        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
                //Solo per debugging
                Log.i(LOG_TAG, "Service Started");
                return super.onStartCommand(intent, flags, startId);
        }


        @Override
        public void onDestroy() {
                backgroundThread.running = false;
                super.onDestroy();
                //Solo per debugging
                Log.i(LOG_TAG, "Service Destroyed");
        }

        /* (non-Javadoc)
         * @see android.app.Service#onBind(android.content.Intent)
         */
        @Override
        public IBinder onBind(Intent arg0) {
                // Ritorniamo null in quanto non si vuole permettere
                // l'accesso al servizio da una applicazione diversa dalla nostra
                return null;
        }


        private final class BackgroundThread extends Thread {

                public boolean running = true;

                public void run() {
                       
                        Log.i(LOG_TAG, "BackgroundThread Started");       
                       
                        //Verifico la presenza di copertura Wi-Fi o 3G.
                        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
                        NetworkInfo netInfo = cm.getActiveNetworkInfo();

                        while(running && (netInfo != null && netInfo.isConnected())) {
                               
                                netInfo = cm.getActiveNetworkInfo();
                               
                                //Inserire qua le operazioni delle quali si deve occupare il service quando c'è copertura di rete
                               
                               
                               
                               
                               
                               
                               
                               
                        }
                       
                        // Al termine del metodo run terminiamo automaticamente il servizio
                        stopSelf();
                       
                }

        }

}

Dalla mia activity ho avviato il servizio così:

Codice: [Seleziona]
//Inizializziamo l'Intent del servizio locale
        serviceIntent = new Intent(this,MyLocalService.class);
            startService(serviceIntent);
            Log.d("Debug", "Service Started from activity")

Ed infine, nel Manifest, ho inserito questa riga prima della chiusura del tag application:

Codice (XML): [Seleziona]
 <service android:name=".MyLocalService"></service>
Da logcat tutto pare funzionare correttamente. Grazie mille Ricky!  ;-)