【发布时间】:2015-05-13 11:25:15
【问题描述】:
我尝试在单个后台线程中使用 AsyncTask 执行以下代码。它给出了错误的文件号。
在谷歌上搜索后,我发现不止一个线程尝试同时访问或打开以下文件,但在我的场景中,只有一个后台线程正在使用 asynctask 运行。并且下面的 decodeBitmapFromDescriptor 方法是在 SinglTone 类中定义的。
public Bitmap decodeBitmapFromDescriptor(Uri data, int reqWidth, int reqHeight) throws FileNotFoundException {
FileDescriptor fileDescriptor= mContext.getContentResolver().
openFileDescriptor(data, "r").getFileDescriptor();
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
Bitmap bmp=BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options);
// it returns null don't know why ?? it works on api level 21
if(bmp==null){
bmp=BitmapFactory.decodeFileDescriptor(fileDescriptor);
}
return bmp;
}
以下是错误的堆栈跟踪。
java.io.IOException: read failed: EBADF (Bad file number) 05-13 11:16:04.652 17881-19663/com.espec.bosleo.espec W/System.err: at libcore.io.IoBridge.read(IoBridge.java:442) 05-13 11:16:04.652 17881-19663/com.espec.bosleo.espec W/System.err﹕在 java.io.FileInputStream.read(FileInputStream.java:179) 05-13 11:16:04.652 17881-19663/com.espec.bosleo.espec W/System.err: at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:168) 05-13 11:16:04.652 17881-19663/com.espec.bosleo.espec W/System.err﹕ 在 java.io.BufferedInputStream.read(BufferedInputStream.java:309) 05-13 11:16:04.652 17881-19663/com.espec.bosleo.espec W/System.err﹕ 在 android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 05-13 11:16:04.652 17881-19663/com.espec.bosleo.espec W/System.err﹕ 在 android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:527) 05-13 11:16:04.652 17881-19663/com.espec.bosleo.espec W/System.err﹕ 在 android.graphics.BitmapFactory.decodeFileDescriptor(BitmapFactory.java:626) 05-13 11:16:04.652 17881-19663/com.espec.bosleo.espec W/System.err﹕ 在 android.graphics.BitmapFactory.decodeFileDescriptor(BitmapFactory.java:644) ....................................
注意:以上代码在 Lollipop 版本 API21 上正常工作
【问题讨论】:
标签: android multithreading android-asynctask android-contentprovider file-descriptor