Autore Topic: Service parte bene e finisce male  (Letto 472 volte)

Offline x69asterix2

  • Utente junior
  • **
  • Post: 127
  • Respect: +1
    • Mostra profilo
Service parte bene e finisce male
« il: 29 Aprile 2015, 10:44:15 CEST »
0
allora ho un service che viene lanciato all'accensione del device,
questo fa il suo compito per un paio di cicli ad intervallo di (60000) dopo
un paio di cicli il tempo non è
più rispettato ed invece di attendere 1mn a volte impiega anche 3/5 mn .
manifest
Codice: [Seleziona]
<service
            android:name=".MsgRepeat"
            android:enabled="true"
            android:exported="false" >

            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            </intent-filter>

        </service>
Codice: [Seleziona]
public class MsgRepeat extends Service {
    final static String DB_PATH = "......";
    private SQLiteDatabase db0;
    int c;
    Handler handler = new Handler();

    public MsgRepeat() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    private final Runnable sendData = new Runnable() {
        public void run() {
            try {
                c = 0;
                handler.postDelayed(this, 60000);
                contamsg();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        handler.post(sendData);
    //  contamsg();
        return START_STICKY;
    }

 

   
    private void contamsg(){
        db0 = SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.OPEN_READWRITE);
        Cursor mycursortemp = db0.rawQuery("SELECT COUNT(user) FROM temp", null);
        if (mycursortemp.moveToFirst()) {
            c = mycursortemp.getInt(0);
            setBadge(getApplicationContext(), c);
        }
        mycursortemp.close();
      //  db0.close();
        if(c > 0){
            Cursor mycursortem = db0.rawQuery("SELECT msgnotifica FROM setting", null);
            int msg = 0;

            if (mycursortem.moveToFirst()) {
                msg = mycursortem.getInt(mycursortem.getColumnIndexOrThrow("msgnotifica"));
            }
            mycursortem.close();
            db0.close();

            if (msg == 1) {
                playDefaultNotificationSound();
            }

        }

    }
 
avete suggerimenti?

Post unito: 29 Aprile 2015, 12:10:23 CEST
credo che adesso ci sono, ho spostato l'handler da onstartcommand a oncreate.
Codice: [Seleziona]
public void onCreate() {
        super.onCreate();
        handler.post(sendData);
    }
« Ultima modifica: 29 Aprile 2015, 12:10:23 CEST da x69asterix2, Reason: Merged DoublePost »

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Service parte bene e finisce male
« Risposta #1 il: 29 Aprile 2015, 12:16:43 CEST »
0
leggendo la documentazione:
Handler | Android Developers, long)
Citazione
Causes the Runnable r to be added to the message queue, to be run after the specified amount of time elapses. The runnable will be run on the thread to which this handler is attached. The time-base is uptimeMillis(). Time spent in deep sleep will add an additional delay to execution.

SystemClock | Android Developers()
Citazione
Returns milliseconds since boot, not counting time spent in deep sleep.

Returns
milliseconds of non-sleep uptime since boot.

Quindi, il tuo tempo dipende da quanto il device sta in sleep...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline x69asterix2

  • Utente junior
  • **
  • Post: 127
  • Respect: +1
    • Mostra profilo
Re:Service parte bene e finisce male
« Risposta #2 il: 29 Aprile 2015, 13:26:46 CEST »
0
ciao,
quindi come posso come risolvo?

Offline tonno16

  • Utente storico
  • *****
  • Post: 1187
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Service parte bene e finisce male
« Risposta #3 il: 29 Aprile 2015, 14:14:23 CEST »
0
Perché non fai un alarm manager con intervallo e ripetizione ogni minuto? E dentro il reveiver avvi il service se devi fare del lavoro pesante.

Offline x69asterix2

  • Utente junior
  • **
  • Post: 127
  • Respect: +1
    • Mostra profilo
Re:Service parte bene e finisce male
« Risposta #4 il: 29 Aprile 2015, 14:42:41 CEST »
0
non ho mai usato alarm manager, la sua funzione qual'è?
viene visualizzato tramite pop up o gira in background?

Post unito: 29 Aprile 2015, 15:00:00 CEST
ok...
grazie tonno16 :-)
risolto
Codice: [Seleziona]
   Intent ishintent = new Intent(ctx, MsgRepeat.class);
            PendingIntent pintent = PendingIntent.getService(ctx, 0, ishintent, 0);
            AlarmManager alarm = (AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE);
            alarm.cancel(pintent);
            alarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 5000, pintent);
« Ultima modifica: 29 Aprile 2015, 15:00:00 CEST da x69asterix2, Reason: Merged DoublePost »

Offline tonno16

  • Utente storico
  • *****
  • Post: 1187
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Service parte bene e finisce male
« Risposta #5 il: 29 Aprile 2015, 15:15:43 CEST »
0
Mi raccomando. Il reveiver non può fare lunghe operazioni nel metodo onReceive().

Offline x69asterix2

  • Utente junior
  • **
  • Post: 127
  • Respect: +1
    • Mostra profilo
Re:Service parte bene e finisce male
« Risposta #6 il: 29 Aprile 2015, 15:21:50 CEST »
0
le operazioni sono quelle specificate sopra cioè un'interrogazione al db

il service l'ho modificato:
Codice: [Seleziona]
    private void contamsg(){
        db0 = SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.OPEN_READWRITE);
        Cursor mycursortemp = db0.rawQuery("SELECT COUNT(user) FROM temp", null);
        if (mycursortemp.moveToFirst()) {
            c = mycursortemp.getInt(0);
            setBadge(getApplicationContext(), c);
        }
        mycursortemp.close();
      //  db0.close();
        if(c > 0){
            Cursor mycursortem = db0.rawQuery("SELECT msgnotifica FROM setting", null);
            int msg = 0;

            if (mycursortem.moveToFirst()) {
                msg = mycursortem.getInt(mycursortem.getColumnIndexOrThrow("msgnotifica"));
            }
            mycursortem.close();
            db0.close();

            if (msg == 1) {
                playDefaultNotificationSound();
            }

        }

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

      contamsg();
        return START_STICKY;
    }
e devo dire che funzione alla perfezione, tu a cosa ti riferisci

Post unito: 29 Aprile 2015, 15:35:41 CEST
invece per cancellare l'alarm
Codice: [Seleziona]
  Intent intentstop = new Intent(getApplicationContext(), MsgRepeat.class);
                    PendingIntent senderstop = PendingIntent.getBroadcast(getApplicationContext(),0, intentstop, 0);
                    AlarmManager alarmManagerstop = (AlarmManager) getSystemService(ALARM_SERVICE);
                    alarmManagerstop.cancel(senderstop);                 
che lancio da un button
« Ultima modifica: 29 Aprile 2015, 15:35:41 CEST da x69asterix2, Reason: Merged DoublePost »