删除后台线程中的文件

时间:2017-02-04 03:02:34

标签: android multithreading service android-asynctask mediastore

任务:我想在后台线程中删除MediaStore中的文件,这样用户可以在线程工作时使用我的应用。


问题: 我知道每次进程完成时,它的线程也会完成它们的工作。因此,这意味着如果用户快速关闭应用程序,我将无法从MediaStore中删除所有选定的文件,从而导致进程终止。

可能的解决方案:您认为将该程序作为单独的流程(任务)实施是一个好主意吗?例如,使用Service

代码

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


更新

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

谢谢!

1 个答案:

答案 0 :(得分:1)

是的,当你说&#34;作为一个单独的过程(任务)&#34;它听起来像是Service 但是的合适人选。这不是Java.Lang.ClassNotFoundException: licensingApp.droid.views.ShowLicencesFragment

  

服务不是一个单独的过程。 Service对象本身并不意味着它在自己的进程中运行;除非另有说明,否则它与其所属的应用程序运行的过程相同。

     

服务不是线程。它不是从主线程开始工作的手段(以避免应用程序无响应错误)。

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

这是有效的,因为用户通常不会以杀死进程的方式关闭应用程序。即使在所有活动都已关闭之后,即使从最近的应用列表中删除,应用仍会继续运行。