Android文件复制导致java.io.IOException:文件描述符已关闭

Android文件复制导致java.io.IOException:文件描述符已关闭,android,linux,android-asynctask,android-contentprovider,android-fileprovider,Android,Linux,Android Asynctask,Android Contentprovider,Android Fileprovider,我的应用程序复制了一堆文件,请求以列表的形式出现。我实现了一个ContentProvider,所以我需要复制一个文件并向我的文件提供程序注册它。我尝试了两件事——为每个文件副本旋转一个异步任务,以及旋转一个异步任务来处理所有文件副本。我所面临的问题是,在执行多个异步任务时,手机的速度实际上会减慢一两秒钟。但是,在逐个处理文件时,我会关闭IOException-文件描述符: D .doInBackground() - outputUri is /photo/201

我的应用程序复制了一堆文件,请求以列表的形式出现。我实现了一个ContentProvider,所以我需要复制一个文件并向我的文件提供程序注册它。我尝试了两件事——为每个文件副本旋转一个异步任务,以及旋转一个异步任务来处理所有文件副本。我所面临的问题是,在执行多个异步任务时,手机的速度实际上会减慢一两秒钟。但是,在逐个处理文件时,我会关闭IOException-文件描述符:

                D  .doInBackground() - outputUri is /photo/20150602004304409
                D  .doInBackground() - outputUri is /photo/20150602004304421
                D  .doInBackground() - outputUri is /photo/20150602004304423
                D  .doInBackground() - outputUri is /photo/20150602004304426
                D  .doInBackground() - outputUri is /photo/20150602004304428

                E  java.io.IOException: File descriptor closed
                E      at libcore.io.Posix.writeBytes(Native Method)
                E      at libcore.io.Posix.write(Posix.java:223)
                E      at libcore.io.BlockGuardOs.write(BlockGuardOs.java:313)
                E      at libcore.io.IoBridge.write(IoBridge.java:497)
                E      at java.io.FileOutputStream.write(FileOutputStream.java:186)
这是我的代码:

 Uri outputUri = Uri.parse(String.format(path, context.getPackageName()));
 mOutputUri = context.getContentResolver().insert(outputUri, null);
 if (AndroidHelper.isGingerBreadMR1()) {
     execute();
 } else {
     executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
 }

getMediaFileDescriptor如下所示:

private FileDescriptor getMediaFileDescriptor(Uri outputUri) {
    try {
        return mContext.getContentResolver().openFileDescriptor(outputUri, "w")
                .getFileDescriptor();
    } catch (FileNotFoundException e) {
        Log.e(TAG, ".getMediaFileDescriptor() - Error opening media output stream", e);
    }
    return null;
}

我有点问题,不太好,但你必须在关闭它之前冲洗一下

while ((read = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, read);
                outputStream.Flush();
            }

这段代码解决了我的问题。

您还应该确保在使用完
getContentResolver().openFileDescriptor
返回的
ParcelFileDescriptor
后,调用它。

您确定没有反复使用相同的文件描述符吗。关闭流后,文件描述符无效。同时共享logcat输出每次输出uri都是一个新的uri-我已经检查过了。在fileDescriptor对象上执行简单的toString也会返回不同的值。。。除非contentresolver在封面下重用文件描述符?有什么方法可以检查/保护它吗?添加了路径输出的日志只是为了检查,不要关闭流。看看会发生什么。
while ((read = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, read);
                outputStream.Flush();
            }