Autore Topic: Service e thread  (Letto 1356 volte)

Offline andexp

  • Utente junior
  • **
  • Post: 60
  • Respect: 0
    • Mostra profilo
Service e thread
« il: 17 Novembre 2012, 18:35:29 CET »
0
ciao a tutti, stavo creando il mio primo Service e volevo chiedervi:
1. per la realizzazione di un Service è obbligatorio usare i Thread?
2. se la 1 non è vera come posso gestire (in maniera da consumare meno cpu) un ciclo di istruzione (es. realizzato con Runnable) ma magari evitando di usare i Thread?
grazie

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Service e thread
« Risposta #1 il: 17 Novembre 2012, 21:23:18 CET »
0
1. no
2. discorso molto lungo!

Non e' che usando un thread si consuma meno cpu (anzi, solitamente e' il contrario). Devi usare un thread per lasciare libero il thread che si occupa della UI (che solitamente ha una priorita' piu' altra).

Se vuoi un service che viene eseguito in un thread a parte, dai una occhiata alla classe IntentService.

Offline andexp

  • Utente junior
  • **
  • Post: 60
  • Respect: 0
    • Mostra profilo
Re:Service e thread
« Risposta #2 il: 18 Novembre 2012, 09:31:56 CET »
0
vedevo la classe Runnable, pare sia l'equivalente di un Thread o sbaglio?

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Service e thread
« Risposta #3 il: 21 Novembre 2012, 15:54:28 CET »
0
Runnable è una interfaccia, Thread è una classe... non capisco cosa vuoi dire...

Offline andexp

  • Utente junior
  • **
  • Post: 60
  • Respect: 0
    • Mostra profilo
R: Service e thread
« Risposta #4 il: 21 Novembre 2012, 16:46:39 CET »
0
Fondamentalmente quando si USA una piuttosto che l'altra?



Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Service e thread
« Risposta #5 il: 21 Novembre 2012, 16:50:01 CET »
0
Come dice il buon Marco non sono tecnicamente la stessa cosa: una è una classe, l'altra è un'interfaccia; una la estendi (extends), l'altra la implementi (implements).

Da un punto di vista di utilizzo una classe che estende Thread la puoi lanciare autonomamente:
Codice (Java): [Seleziona]
Thread myThread = new MyThread(); // MyThread extends Thread
myThread.start();
una classe che implementa Runnable ha invece bisogno di un Thread per essere lanciata:
Codice (Java): [Seleziona]
Runnable myRunnable = new MyRunnable(); // MyRunnable implements Runnable
new Thread(myRunnable).start()

Da un punto di vista di risorse (occupazione cpu, allocazione memoria, ecc...) i due approcci sono di fatto equivalenti.

Perché ci sono entrambi gli approcci, e quando conviene usare un approccio invece dell'altro?
Alidlà di questioni meramente filosofiche che lasciano il tempo che trovano, per me la risposta più semplice è la migliore: in java non c'è l'ereditarietà multipla; per cui se voglio estendere le funzionalità di una classe che ho già (naturalmente non Thread di suo) rendendola anche eseguibile su thread separato, devo per forza ricorrere a Runnable.
Non posso estendere da una classe e da Thread, ma posso estendere da una classe e implementare Runnable.





Offline MisterAnt

  • Utente normale
  • ***
  • Post: 272
  • Respect: +4
    • IlSikano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S4 Active,Galaxy SIII I9300, Galaxy Tab GT-P5100
  • Play Store ID:
    MisterAnt
  • Sistema operativo:
    Ubuntu 12.04/Winzoz 7/Winzoz xp
Re:Service e thread
« Risposta #6 il: 27 Novembre 2012, 15:34:41 CET »
0
Scusa Sakazaki..ma io richiamo una mia classe Runnable semplicemente creandola e passandogli getApplicationContext() come parametro...
Così facendo funziona ..anche se non è sua madre XD dici che è meglio usare un thread????
Se le zampe del coniglio sono così fortunate, che fine ha fatto il coniglio?

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Service e thread
« Risposta #7 il: 27 Novembre 2012, 15:50:21 CET »
0
Scusa Sakazaki..ma io richiamo una mia classe Runnable semplicemente creandola e passandogli getApplicationContext() come parametro...
Così facendo funziona ..anche se non è sua madre XD dici che è meglio usare un thread????

uhm... scusa ma non ho capito che intendi quando dici "creandola e passandogli getApplicationContext() come parametro"...

Offline MisterAnt

  • Utente normale
  • ***
  • Post: 272
  • Respect: +4
    • IlSikano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S4 Active,Galaxy SIII I9300, Galaxy Tab GT-P5100
  • Play Store ID:
    MisterAnt
  • Sistema operativo:
    Ubuntu 12.04/Winzoz 7/Winzoz xp
Re:Service e thread
« Risposta #8 il: 27 Novembre 2012, 16:48:07 CET »
0
Allora...io in un progetto utilizzo una classe che implementa Runnable..
Per richiamarla in un altra classe non faccio altro che:
 -Prova a=new Prova(getApplicationContext()) //Prova è una classe che implements Runnable...la classe Prova deve avere il Context passato per forza come parametro
Volevo capire che differenza c'è nell'istanziare una classe così come ho fatto io e come hai fatto tu :
-Runnable myRunnable = new MyRunnable(); // MyRunnable implements Runnable
 new Thread(myRunnable).start();

Insomma..mi conviene usare il thread come hai fatto tu??

Se le zampe del coniglio sono così fortunate, che fine ha fatto il coniglio?

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Service e thread
« Risposta #9 il: 27 Novembre 2012, 17:04:51 CET »
0
Se non ho capito male insomma tu fai:

Codice (Java): [Seleziona]
public void doSomething() {
  Prova a=new Prova(getApplicationContext()); //Prova è una classe che implements Runnable
  a.run();
  // altre istruzioni
}

e vorresti sapere la differenza che passa con:
Codice (Java): [Seleziona]
public void doSomething() {
  Prova a=new Prova(getApplicationContext()); //Prova è una classe che implements Runnable
  new Thread(a).start();
  // altre istruzioni
}

ci sta che non abbia capito, ma se è ho interpretato bene la differenza è che:
- nel primo caso sei sempre nello stesso thread, e quindi le istruzioni che seguono a a.run(); vengono eseguite solo quando hai finito di eseguire prima il run.
- nel secondo caso lanci un nuovo thread, e le istruzioni che seguono a.run(); (lanciato in automatico dallo start) vengono eseguite in parallelo.

Poi magari non ho davvero capito una ciaspola della domanda...

Offline MisterAnt

  • Utente normale
  • ***
  • Post: 272
  • Respect: +4
    • IlSikano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S4 Active,Galaxy SIII I9300, Galaxy Tab GT-P5100
  • Play Store ID:
    MisterAnt
  • Sistema operativo:
    Ubuntu 12.04/Winzoz 7/Winzoz xp
Re:Service e thread
« Risposta #10 il: 27 Novembre 2012, 17:07:40 CET »
0
Okay grazie1000
Se le zampe del coniglio sono così fortunate, che fine ha fatto il coniglio?