任务:我想在后台线程中删除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();
}
}
谢谢!
答案 0 :(得分:1)
是的,当你说&#34;作为一个单独的过程(任务)&#34;它听起来像是Service
但是的合适人选。这不是Java.Lang.ClassNotFoundException: licensingApp.droid.views.ShowLicencesFragment
:
服务不是一个单独的过程。 Service对象本身并不意味着它在自己的进程中运行;除非另有说明,否则它与其所属的应用程序运行的过程相同。
服务不是线程。它不是从主线程开始工作的手段(以避免应用程序无响应错误)。
https://developer.android.com/reference/android/app/Service.html#WhatIsAService
这是有效的,因为用户通常不会以杀死进程的方式关闭应用程序。即使在所有活动都已关闭之后,即使从最近的应用列表中删除,应用仍会继续运行。