2017-10-10 2 views
-2

J'ai besoin d'enregistrer "Un peu de texte" dans le stockage des périphériques toutes les 5 minutes peut-on me signaler la meilleure façon de le faire. Mais je ne veux pas que le thread principal se bloque et que le thread de journalisation soit actif tout le temps. J'ai essayé cela, mais il semble geler mon émulateur est-il une meilleure façon de faire la même choseExécution d'un service d'arrière-plan android sans geler l'interface utilisateur

public class DataWriteService extends Service { 

private FileIOHelper fileHelper= new FileIOHelper("Test.txt"); 
@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 


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

    //Gets location and writes to a file 
    fileHelper.writeToFile(this, "Some text"); 

    return START_STICKY; 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
} 

}

+2

En citant [JavaDocs for 'Service'] (https://developer.android.com/reference/android/app/Service.html):" Un service n'est pas un thread "et, dans [le JavaDocs pour 'onStartCommand()'] (https://developer.android.com/reference/android/app/Service.html#onStartCommand (android.content.Intent,% 20int,% 20int)): "Notez que le système appelle ceci sur le thread principal de votre service ... Vous devez toujours éviter de bloquer la boucle d'événements du thread principal.Si vous faites des opérations longues, des appels réseau ou des E/S disque, vous devez lancer un nouveau thread ". Vous n'avez pas démarré de discussion, votre travail gèle donc votre interface utilisateur. – CommonsWare

Répondre

0

Utilisez Handler ou séparé fil de fond pour terminer votre travail à long. Une fois que vous avez terminé, postez la valeur sur le thread UI. Btw, sur Android O +, le service ne fonctionnera que tant que votre application est en vie. Dès que votre application est en arrière-plan, l'application arrête le service. Envisagez d'utiliser JobScheduler