0

Tâche: Je souhaite supprimer des fichiers de MediaStore dans un fil d'arrière-plan, afin que l'utilisateur puisse travailler avec mon application pendant que le fil fonctionne.Supprimer des fichiers dans un fil d'arrière-plan


Problème: Je sais que chaque fois qu'un processus se termine, ses fils terminer leur travail aussi bien. Donc, cela signifie que je ne serai pas en mesure de supprimer tous les fichiers sélectionnés à partir du MediaStore, si l'utilisateur ferme rapidement l'application, ce qui tue le processus.

Solution possible: Pensez-vous que ce serait une bonne idée d'implémenter cette procédure en tant que processus séparé (tâche)? Par exemple, en utilisant un Service.

code:

Snackbar.make(findViewById(R.id.rootView),message) 
        .setAction("UNDO", new View.OnClickListener() { 
         @Override 
         public void onClick(View view) { 
          //restore data 
         } 
        }) 
        .addCallback(new BaseTransientBottomBar.BaseCallback<Snackbar>() { 
         @Override 
         public void onDismissed(Snackbar transientBottomBar, int event) { 
          super.onDismissed(transientBottomBar, event); 
          switch (event) { 
           case DISMISS_EVENT_SWIPE: 
           case DISMISS_EVENT_TIMEOUT: 
            //delete the files using either a background thread, or a separate task 
            break; 
          } 
         } 
        }) 
        .show(); 


MISE À JOUR:

public static void deleteFile(Context context, File mediaFile) { 
    if(!mediaFile.delete()) { 
     Log.e(TAG, "Cannot delete file "+ mediaFile.getAbsoluteFile()); 

    } 
    String[] projection = { MediaStore.Images.Media._ID }; 

    String selection = MediaStore.Images.Media.DATA + " = ?"; 
    String[] selectionArgs = new String[] { mediaFile.getAbsolutePath() }; 

    Uri queryUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
    ContentResolver contentResolver = context.getContentResolver(); 
    Cursor cursor = contentResolver.query(queryUri, projection, selection, selectionArgs, null); 

    if(cursor!=null) { 
     if (cursor.moveToFirst()) { 
      long id = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)); 
      Uri deleteUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id); 
      contentResolver.delete(deleteUri, null, null); 
     } 
     cursor.close(); 
    } 
} 

Merci!

+0

Combien de fichiers? Ce processus prend beaucoup de temps? – weston

+0

Cela dépend. Il peut 10 ou 1000. Fondamentalement, un utilisateur peut supprimer le dossier entier des fichiers. – nullbyte

+0

La suppression de 1000 fichiers prend-elle beaucoup de temps? Particulièrement dans un dossier ensemble. Je suppose que vous n'êtes pas en train de supprimer mais de mettre à jour le 'MediaStore' aussi. – weston

Répondre

1

Oui, il sonne comme un bon candidat pour un Servicemais quand vous dites « comme un processus distinct (tâche) » qui est pas ce qu'est un Service est:

Un service n'est pas un processus séparé . L'objet Service lui-même n'implique pas qu'il s'exécute dans son propre processus; sauf indication contraire, il s'exécute dans le même processus que l'application dont il fait partie.

Un service n'est pas un thread. Ce n'est pas un moyen lui-même de faire du travail à partir du thread principal (pour éviter les erreurs Application Not Responding).

https://developer.android.com/reference/android/app/Service.html#WhatIsAService

Cela fonctionne parce que les utilisateurs font généralement pas des applications proches d'une manière qui tue le processus. Les applications continuent de fonctionner, même après la fermeture de toutes les activités et même après leur suppression de la liste des dernières applications.

+0

Oui, ce n'est pas le cas. Cependant, je peux le spécifier comme un processus séparé, n'est-ce pas? C'est exactement ce que je demande, est-ce que cela en vaut la peine? – nullbyte

+0

Non, ce serait plus difficile et sans aucune bonne raison. Voir ma nouvelle édition. Vous pouvez utiliser le processus existant car il reste en place une fois les activités terminées, en particulier lorsqu'un service est en cours d'exécution. – weston

+0

Si je me trompe à ce sujet cependant, et il est préférable d'avoir son propre processus, c'est une simple conversion dans le manifeste apparemment: http://stackoverflow.com/a/38318003/360211 – weston