Android 删除后台线程中的文件

Android 删除后台线程中的文件,android,multithreading,service,android-asynctask,mediastore,Android,Multithreading,Service,Android Asynctask,Mediastore,任务:我想在后台线程中删除MediaStore中的文件,这样用户可以在线程运行时使用我的应用程序 问题: 我知道,每当进程完成时,它的线程也会完成它们的工作。因此,这意味着如果用户快速关闭应用程序,从而终止进程,我将无法从MediaStore中删除所有选定的文件 可能的解决方案:您认为将该过程作为单独的processtask实现是一个好主意吗?例如,使用服务 代码: 谢谢大家! 是的,这听起来像是一个很好的服务候选者,但当你说作为一个单独的processtask,这不是服务: 服务不是一个单

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

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

可能的解决方案:您认为将该过程作为单独的processtask实现是一个好主意吗?例如,使用服务

代码:


谢谢大家!

是的,这听起来像是一个很好的服务候选者,但当你说作为一个单独的processtask,这不是服务:

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

服务不是线程。它本身并不是一种处理主线程以避免应用程序不响应错误的方法


这是因为用户通常不会以终止进程的方式关闭应用程序。应用程序继续运行,即使在关闭所有活动后,甚至在从“最近使用的应用程序”列表中注销时。

有多少个文件?这一过程需要花费大量的时间?视情况而定。它可以是10或1000。基本上,用户可以删除整个文件夹中的文件。删除1000个文件需要多长时间?尤其是在一个文件夹里。我猜你不仅仅是在删除,而是在更新MediaStore。这需要足够的时间。如果我想删除1000个文件,然后立即关闭应用程序,它将删除大约10-20个文件。是的,没错,我也在更新MediaStore。我现在就发布这个程序的代码。是的,不是。但是,我可以将其指定为一个单独的过程,对吗?这正是我要问的,值得这样做吗?不,这将更加困难,而且没有任何好的理由。查看我的新编辑。您可以使用现有流程,因为它在活动结束后仍然存在,特别是在有服务运行的情况下。但是,如果我错了,最好是有自己的流程,这显然是清单中的一个简单转换:这支持了我的想法:是的,当活动开始时,当然,它可以显示任何正在运行的删除服务的进度。通知进度将非常出色,就像此应用在复制文件时所做的那样:
 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();
    }
}