0

Aufgabe: Ich möchte Dateien aus MediaStore in einem Hintergrundthread löschen, damit der Benutzer mit meiner App arbeiten kann, während der Thread funktioniert.Dateien in einem Hintergrundthread löschen


Problem: Ich weiß, dass jedes Mal, wenn ein Prozess beendet ist, seine Fäden als auch ihre Arbeit beenden. Es bedeutet also, dass ich nicht alle ausgewählten Dateien aus der MediaStore löschen kann, wenn der Benutzer die App schnell schließt und damit den Prozess beendet.

Mögliche Lösung: Denken Sie, ist es eine gute Idee, dieses Verfahren als separaten Prozess (Task) zu implementieren? Zum Beispiel mit einem 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(); 


UPDATE:

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(); 
    } 
} 

Thank you!

+0

Wie viele Dateien? Dieser Prozess benötigt eine erhebliche Zeit? – weston

+0

Es kommt darauf an. Es kann 10 oder 1000. Grundsätzlich kann ein Benutzer den gesamten Ordner von Dateien löschen. – nullbyte

+0

dauert es lange 1000 Dateien zu löschen? Besonders in einem Ordner zusammen. Ich nehme an, Sie löschen nicht nur, sondern aktualisieren auch den 'MediaStore'. – weston

Antwort

1

Ja, es klingt wie ein guter Kandidat für ein Serviceaber, wenn Sie „als separaten Prozess (Aufgabe)“ sagen, dass ist nicht das, was ein Service ist:

A Service ist kein separater Prozess . Das Service-Objekt selbst bedeutet nicht, dass es in seinem eigenen Prozess läuft; Wenn nicht anders angegeben, läuft es im selben Prozess wie die Anwendung, zu der es gehört.

Ein Dienst ist kein Thread. Es ist kein Mittel, um vom Hauptthread abzuarbeiten (um zu vermeiden, dass die Anwendung nicht reagiert).

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

Dies funktioniert, weil die Benutzer im Allgemeinen nicht nahe Apps in einer Weise, die den Prozess tötet. Apps werden weiterhin ausgeführt, auch nachdem alle Aktivitäten geschlossen wurden und auch wenn sie aus der Liste der zuletzt verwendeten Apps entfernt wurden.

+0

Ja, ist es nicht. Ich kann es jedoch als einen separaten Prozess spezifizieren, oder? Genau das ist es, was ich verlange, ist es das wert? – nullbyte

+0

Nein, das wäre härter und ohne guten Grund. Siehe meine neue Bearbeitung. Sie können den vorhandenen Prozess verwenden, da er nach dem Beenden der Aktivitäten blockiert bleibt, insbesondere wenn ein Service ausgeführt wird. – weston

+0

Wenn ich aber falsch liege, und es ist besser, seinen eigenen Prozess zu haben, ist es eine einfache Umwandlung im Manifest anscheinend: http://stackoverflow.com/a/38318003/360211 – weston

Verwandte Themen