Autore Topic: prestazione del multiThreading in Android  (Letto 2752 volte)

Offline dragonfly89

  • Nuovo arrivato
  • *
  • Post: 46
  • Respect: +1
    • Mostra profilo
prestazione del multiThreading in Android
« il: 08 Febbraio 2013, 16:51:38 CET »
0
salve ragazzi...vorrei un'informazione sul multithreading in Android...allora la mia App ha bisogno di un qualcosa che ad intervalli di temp0 , più o meno di un minuto , esegua delle operazioni...a tal proposito mi chiedevo se la creazione dunque l'esecuzione di un thread possa in qualke modo "consumare" molto processore diciamo...considerando il fatto che comunque in generale il processore durante l'esecuzione della mia App fa molto lavoro (perkè deve prendersi dati da internet quali parserizzare file.xls ecc ecc) se aggiungo thread forse appensantisco un po il tutto...però penso che comunque non ci sia l'alternativa al thread...voi che consigli mi date?????
grazie in anticipo :-)

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:prestazione del multiThreading in Android
« Risposta #1 il: 08 Febbraio 2013, 17:06:55 CET »
0
Per elaborazioni piuttosto lunghe potresti prendere in considerazione di sfruttare la classe Handler, che almeno ti permette di accodare i thread che lanci in modo che non si sovrappongano tra loro (e può succedere se l'intervallo di tempo è così breve che l'esecuzione non fa a tempo a terminare il suo lavoro).

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:prestazione del multiThreading in Android
« Risposta #2 il: 08 Febbraio 2013, 17:39:01 CET »
+1
se aggiungo thread forse appensantisco un po il tutto...però penso che comunque non ci sia l'alternativa al thread...voi che consigli mi date?????

Ti posso rassicurare che l'aggiunta dei thread non appesantisce più di altre soluzioni, quello che potenzialmente può far esplodere il consumo batteria è dover eseguire qualcosa ogni 60 secondi.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

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:prestazione del multiThreading in Android
« Risposta #3 il: 08 Febbraio 2013, 17:42:00 CET »
0
Ti posso rassicurare che l'aggiunta dei thread non appesantisce più di altre soluzioni, quello che potenzialmente può far esplodere il consumo batteria è dover eseguire qualcosa ogni 60 secondi.

Confermo (della serie: storie di vita vissuta  :-P)

Offline dragonfly89

  • Nuovo arrivato
  • *
  • Post: 46
  • Respect: +1
    • Mostra profilo
Re:prestazione del multiThreading in Android
« Risposta #4 il: 08 Febbraio 2013, 21:59:17 CET »
0
Citazione


Ti posso rassicurare che l'aggiunta dei thread non appesantisce più di altre soluzioni, quello che potenzialmente può far esplodere il consumo batteria è dover eseguire qualcosa ogni 60 secondi.

Citazione
Per elaborazioni piuttosto lunghe potresti prendere in considerazione di sfruttare la classe Handler, che almeno ti permette di accodare i thread che lanci in modo che non si sovrappongano tra loro (e può succedere se l'intervallo di tempo è così breve che l'esecuzione non fa a tempo a terminare il suo lavoro).

implicitamente rispondo ad entrambi...diciamo che io vorrei far eseguire questo thread ogni 2 minuti...quindi ogni 120 secondi...perkè in pratica quello che dovrei fare io è prendermi da un sito la lista degli incontri di calcio live a livello internazionale...il tutto avviene facendo dei metodi get ad un server e poi tramite la responce con delle espressioni regolari mi prendo gli incontri con tanto di risultato parziale..quindi valuto il risultato e , se è cambiato qualkosa ,devo inviare la notifica all'utente...per far ciò penso che 2 minuti non siano molti come tempo di intervallo per ricontrollare i risultati....voi che dite??

grazie mille cmq !!

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
R: prestazione del multiThreading in Android
« Risposta #5 il: 08 Febbraio 2013, 22:12:41 CET »
0
La soluzione più corretta, a mio avviso, è inserire la logica con cui prendi i dati e li parsi in un IntentService e schedularne l'esecuzione periodica tramite la classe AlarmManager.

Inviato dal mio Galaxy Nexus con Tapatalk 2


Offline dragonfly89

  • Nuovo arrivato
  • *
  • Post: 46
  • Respect: +1
    • Mostra profilo
Re:prestazione del multiThreading in Android
« Risposta #6 il: 08 Febbraio 2013, 23:54:29 CET »
0
Citazione
La soluzione più corretta, a mio avviso, è inserire la logica con cui prendi i dati e li parsi in un IntentService e schedularne l'esecuzione periodica tramite la classe AlarmManager.

se puoi spiegati meglio...
grazie tante.

Offline DarnellNajanReed

  • Utente normale
  • ***
  • Post: 359
  • Respect: +49
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One, Acer Iconia A500/501, Asus Transformer Prime, Galaxy ACE, Galaxy S Plus, Galaxy S Advance P, Galaxy Tab 2 7.0, Google Nexus 7
  • Play Store ID:
    Luigi Notaro
  • Sistema operativo:
    OS X 10.8.3
Re:prestazione del multiThreading in Android
« Risposta #7 il: 09 Febbraio 2013, 14:30:48 CET »
0
Considera che, ogni volta che fai partire una chiamata HTTP, il 3G rimane accesso fino a un minuto dopo che hai finito di usare la rete (il valore preciso dipende dall'operatore). Fare una chiamata ogni due minuti potrebbe voler dire, quindi, lasciare attivo il 3G  per molto più tempo di quanto si immagini, con relativo ciucciaggio batteria.

Offline dragonfly89

  • Nuovo arrivato
  • *
  • Post: 46
  • Respect: +1
    • Mostra profilo
Re:prestazione del multiThreading in Android
« Risposta #8 il: 09 Febbraio 2013, 15:01:24 CET »
0
Citazione
Considera che, ogni volta che fai partire una chiamata HTTP, il 3G rimane accesso fino a un minuto dopo che hai finito di usare la rete (il valore preciso dipende dall'operatore). Fare una chiamata ogni due minuti potrebbe voler dire, quindi, lasciare attivo il 3G  per molto più tempo di quanto si immagini, con relativo ciucciaggio batteria.

si me ne rendo conto...ma allora come potrei fare.??? se hai letto il post dove spiego cosa deve fare la mia App, non credo ci siano ulteriori soluzioni...:-(

Offline dragonfly89

  • Nuovo arrivato
  • *
  • Post: 46
  • Respect: +1
    • Mostra profilo
Re:prestazione del multiThreading in Android
« Risposta #9 il: 09 Febbraio 2013, 15:02:32 CET »
0
in ogni caso ragazzi vi chiedo un ulteriore consiglio...nel mio thread eseguo ogni tot tempo delle operazioni...tra queste quella di RILANCIARE un'activity...invece io vorrei che l'activity che lancio e si occupa di "aspettare" l'evento per poi lanciare la notifica venisse creata una sola volta e che restasse diciamo in ascolto...cioè con il codice da me scritto ogni qual volta viene lanciata una notifica all'utente viene rilanciata anke una nuova activity..posto il mio codice commentato e capirete meglio....

Codice (Java): [Seleziona]
public class Listener{

        Context context;

        public Listener(Context context){
                this.context = context;
        }

        public void prova(){

                try{

                        new Thread( new Runnable() {
                                boolean itera = true;
                                Request request = new Request();
                                Extrapolate extrap = new Extrapolate();
                               
                                @Override
                                public void run() {
                                        // TODO Auto-generated method stub
                                        while(itera){
                                              // COME PRIMA COSA ESTRAPOLO I DATI,OVVERO I "NUOVI" RISULTATI LIVE...                                      

                                                String responce = request.connect();
                                                extrap.extrapolateData(responce);
                     
                                            /* ADESSO FACCIO PARTIRE L'ACTIVITY ALL'INTERNO DELLA QUALE VI È UN METODO CHE CONFRONTA I "NUOVI"
                                               RISULTATI LIVE CON I "VECCHI"...DOPO DI CHE VIENE INVOCATO IL METODO "SENDNOTIFICATION" CHE SI OCCUPA
                                              DI INVIARE LA NOTIFICA ALL'UTENTE..
                                             */

        ------------->                  Intent intent = new Intent(context,Compare_Notification.class);
                                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        ------------->                  context.startActivity(intent);

                                             /*
                                              IL PROBLEMA È CHE COSI FACENDO L'ACTIVITY "COMPARE_NOTIFICATION" VIENE CREATA  NUOVAMENTE TANTE            
                                              VOLTE NEL CICLO WHILE...POTRE LANCIARLA FUORI DAL WHILE MA POI COSI FACENDO NON MI VIENE LANCIATA PIÙ
                                              LA NOTIFICA IN QUANDO IL METODO "SEND_NOTIFICATION" È ALL'INTERNO DELL'ACTIVITY....
                                             */

                                               
                                                try{
                                                        Thread.sleep(10000);
                                                }
                                                catch (Exception e) {
                                                        Log.e("ERRORE nella run ", e.getMessage());
                                                }
                                        }
                                }
                        }).start();
                }
                catch (Exception e) {
                        Log.e("Errore in Listener ", e.getMessage());
                }
        }

}

Codice (Java): [Seleziona]
private void sendNotification(String testo){
                //        switch (v.getId()) {
                //        case R.id.btnSendNotify:

                try{
                        String ns = Context.NOTIFICATION_SERVICE;

                        mNotificationManager = (NotificationManager) getSystemService(ns);

                        int icon = android.R.drawable.stat_notify_chat;
                        CharSequence tickerText = "Questo è il tickerText";
                        long when = System.currentTimeMillis();
                        @SuppressWarnings("deprecation")
                        Notification notification = new Notification(icon, tickerText, when);

                        Context context = getApplicationContext();     
                        CharSequence contentTitle = "Titolo della mia notifica";
                        CharSequence contentText = testo;
                        Intent notificationIntent = new Intent(this, Notifica.class);
                    notificationIntent.putExtra("testoNotifica", testo);

                        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
                        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

                        notification.defaults |= Notification.DEFAULT_SOUND;    //Suona
                        notification.defaults |= Notification.DEFAULT_LIGHTS;   //LED
                        notification.defaults |= Notification.DEFAULT_VIBRATE;  //Vibra

                        mNotificationManager.notify(NOTIFICATION_ID, notification);
                       
       
                       
                }
                catch (Exception e) {
                        Log.e("ERRORE nel metodo sendNotification ", e.getMessage());
                }
        }
« Ultima modifica: 09 Febbraio 2013, 15:17:20 CET da dragonfly89 »

Offline dragonfly89

  • Nuovo arrivato
  • *
  • Post: 46
  • Respect: +1
    • Mostra profilo
Re:prestazione del multiThreading in Android
« Risposta #10 il: 13 Febbraio 2013, 02:49:55 CET »
0
ragazzi nessuno sa aiutarmi riguardo l'ultimo post che ho pubblicato???

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:prestazione del multiThreading in Android
« Risposta #11 il: 13 Febbraio 2013, 08:59:12 CET »
0
Lanciare una activity da un thread diverso da quello principale non è corretto.

Puoi spiegare in modo più organico cosa deve fare l'applicazione?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline dragonfly89

  • Nuovo arrivato
  • *
  • Post: 46
  • Respect: +1
    • Mostra profilo
Re:prestazione del multiThreading in Android
« Risposta #12 il: 13 Febbraio 2013, 15:36:10 CET »
0
Citazione
Lanciare una activity da un thread diverso da quello principale non è corretto.

si mi spiego subito..la mia è un'applicazione mobile per gli scommettitori di schedine di calcio...in pratica io mi prendo la lista di tutti gli incotri di calcio prossimi suddivisi per competizione...all'utente quando accede all'app gli verrà visualizzata questa lista..l'utente quindi sceglie le partite per le quali vorrà ricevere gli aggiornamenti e per ognuna di questa partite inserisce la sua puntata,ovvero quello che ha scommesso per quella partita...dopo questo io in pratica mi prendo da internet,appoggiandomi momentaneamente su un sito,la lista degli incontri di calcio Live..se tra questi vi sono gli incontri per i quali l'utente voleva tenersi aggiornato allora l'app confronta il risultato live con quello scommesso dall'utente e,tramite notifica sul dispositivo,informa l'utente...ma ovviamente quest'ultimo passo va fatto ogni tot tempo perkè i risultati live cambiano in continuazione...quindi ho pensato di usare un thread...ora,avendo un'activity che mi gestisce l'invio della notifica,è chiaro che nel thread ogni minuto per esempio devo fare anke la "new" diciamo di quell'activity...e qua sta il problema..io vorrei che una volta lanciata l'activity quest'ultima restasse in ascolto senza che ne viene ricreata ogni volta una nuova..

come posso fare cio??? nel precedente post vi è tutto il codice riferito a cio che ho appena dettto...spero di essere stato chiaro...
grazie in anticipo.

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:prestazione del multiThreading in Android
« Risposta #13 il: 13 Febbraio 2013, 15:57:14 CET »
0
Ti faccio qualche considerazione; bada bene che sono solo considerazioni amichevoli come se fossimo davanti ad uno spritz al bar, non critiche per l'amor di Dio! :)

Considerazione 1: ma pensi davvero che l'utente voglia sapere le variazione del risultato di una partita entro 60 secondi da quando avviene? Posso assicuarti che una frequenza di controllo di una volta ogni 10 minuti potrebbe essere già più che sufficiente.
Considerazione 2: lanciare una verifica schedulata (ogni tot) da un'activity è quantomeno improprio. Per questo genere di "mestieri" ci sono i service.
Considerazione 3: laciare un Notification da un'activity è altrettanto bizzarro, visto che di solito si lanciano dai service che lavorano in background e hanno bisogno di questo meccanismo per informare che hanno "fatto qualcosa" (credo che un po' tutti siamo partiti a leggere i tuoi post pensando che lavoravi con le notifiche da un servizio...). Che senso ha laciare una Notification mentre l'utente ha l'activity aperta davanti? Tanto vale aggiornare direttamente l'activity...
Considerazione 4: ma banalmente mettere un tasto di refresh sull'activity e far partire la verifica solo se l'utente lo pigia no? Giusto per cominciare con qualcosa che sia semplice, pulito e funzionante; poi studiare come funzionano i service in congiunzione con le notifiche per aggiungere questa funzionalità.

Riassumendo: mi sembra che stai cercando di fare il passo più lungo della gamba; cercando di ottenere tutto, subito, avendo solo una vaga idea dell'architettura del sistema operativo e delle sue funzionalità, nel modo più complicato.
Keep It Simple!

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:prestazione del multiThreading in Android
« Risposta #14 il: 13 Febbraio 2013, 16:29:23 CET »
0
Considerazione 4: ma banalmente mettere un tasto di refresh sull'activity e far partire la verifica solo se l'utente lo pigia no? Giusto per cominciare con qualcosa che sia semplice, pulito e funzionante; poi studiare come funzionano i service in congiunzione con le notifiche per aggiungere questa funzionalità.

Raccomando caldamente di seguire quanto sopra consigliato... passi piccoli e semplici, comincia col fare l'activity che esegue l'aggiornamento alla pressione di un Button REFRESH, quando accade fai partire il thread che preleva i dati e al termine aggiorna l'interfaccia grafica dell'activityin base ai dati ricevuti. Poi puoi passare ad automatizzare pian piano tutto quello che vuoi, ma pensare di arrivarci in un solo passo è veramente azzardato.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store