【发布时间】:2014-08-24 05:03:01
【问题描述】:
下面是在 doInBackground() 异步任务中从 MediaStore.Images.Thumbnails.getThumbnail 创建超过 4000 张缩略图的代码。现在我在 Android 2.3.6 中执行。它没有在我得到 RuntimeException 之间创建缩略图。
private void loadImages() {
try {
columns = new String[] { MediaStore.Images.Media.DATA,
MediaStore.Images.Media._ID, MediaStore.Images.Media.SIZE,
MediaStore.Images.Media.TITLE };
orderBy = new String(MediaStore.Images.Media._ID);
fileCursor = getActivity().managedQuery(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns,
null, null, orderBy);
image_column_index = fileCursor
.getColumnIndex(MediaStore.Images.Media._ID);
this.imageCount = fileCursor.getCount();
this.thumbnails = new Bitmap[this.imageCount];
this.arrPath = new String[this.imageCount];
GlobalValues.IMAGE_ARR_PATH = new String[this.imageCount];
GlobalValues.IMAGE_THUMBNAILSSELECTION = new boolean[this.imageCount];
GlobalValues.IMAGES_SIZE = new String[this.imageCount];
this.thumbnailsselection = new boolean[this.imageCount];
if (GlobalValues.IMAGE_SELECTION != null) {
thumbnailsselection = GlobalValues.IMAGE_SELECTION;
GlobalValues.IMAGE_THUMBNAILSSELECTION = thumbnailsselection;
}
int inSample = 1;
BitmapFactory.Options opts=null;
System.out.println("imageCount:"+imageCount);
for (int i = 0; i < this.imageCount; i++) {
fileCursor.moveToPosition(i);
int id = fileCursor.getInt(image_column_index);
int dataColumnIndex = fileCursor
.getColumnIndex(MediaStore.Images.Media.DATA);
arrPath[i] = fileCursor.getString(dataColumnIndex);
GlobalValues.IMAGE_ARR_PATH[i] = fileCursor
.getString(dataColumnIndex);
GlobalValues.IMAGES_SIZE[i] = fileCursor.getString(fileCursor
.getColumnIndex(MediaStore.Images.Media.SIZE));
opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
opts.inSampleSize = inSample;
if (Build.VERSION.SDK_INT > 11) {
bMap = MediaStore.Images.Thumbnails.getThumbnail(
context.getContentResolver(), id,
MediaStore.Images.Thumbnails.MICRO_KIND, opts);
if(bMap != null && !bMap.isRecycled())
thumbnails[i]= bMap;
} else {
if (arrPath[i].endsWith(".png")) {
bMap = BitmapFactory.decodeFile(arrPath[i],opts);
bMap = ThumbnailUtils.extractThumbnail(
bMap, 96, 96);
if(bMap != null && !bMap.isRecycled() )
thumbnails[i]= bMap;
} else{
System.out.println("index:"+i);
//Getting Error in below code
bMap = MediaStore.Images.Thumbnails
.getThumbnail(
context.getContentResolver(),
id,
MediaStore.Images.Thumbnails.MICRO_KIND,
(BitmapFactory.Options) opts);
System.gc();
Runtime.getRuntime().gc();
thumbnails[i]= bMap;
if (bMap != null && !bMap.isRecycled()) {
bMap.recycle();
bMap = null;
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
finally {
fileCursor = null;
}
}
我遇到了以下异常:
07-03 12:40:37.269: E/AndroidRuntime(3185): java.lang.RuntimeException: Canvas: 试图使用回收的位图 android.graphics.Bitmap@4060cc48 07-03 12:40:37.269: E/AndroidRuntime(3185):在 android.graphics.Canvas.throwIfRecycled(Canvas.java:955) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.graphics.Canvas.drawBitmap(Canvas.java:1044) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:325) 07-03 12:40:37.269: E/AndroidRuntime(3185): 在 android.widget.ImageView.onDraw(ImageView.java:872) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.View.draw(View.java:6880) 07-03 12:40:37.269: E/AndroidRuntime(3185):在 android.view.ViewGroup.drawChild(ViewGroup.java:1646) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.drawChild(ViewGroup.java:1644) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.widget.AbsListView.dispatchDraw(AbsListView.java:1586) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.widget.GridView.dispatchDraw(GridView.java:1948) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.View.draw(View.java:6986) 07-03 12:40:37.269: E/AndroidRuntime(3185):在 android.widget.AbsListView.draw(AbsListView.java:2967) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.drawChild(ViewGroup.java:1646) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.drawChild(ViewGroup.java:1644) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.drawChild(ViewGroup.java:1644) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.drawChild(ViewGroup.java:1644) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.View.draw(View.java:6883) 07-03 12:40:37.269: E/AndroidRuntime(3185):在 android.support.v4.view.ViewPager.draw(ViewPager.java:1574) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.drawChild(ViewGroup.java:1646) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.View.draw(View.java:6883) 07-03 12:40:37.269: E/AndroidRuntime(3185):在 android.view.ViewGroup.drawChild(ViewGroup.java:1646) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.drawChild(ViewGroup.java:1644) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.drawChild(ViewGroup.java:1644) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.drawChild(ViewGroup.java:1644) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.View.draw(View.java:6883) 07-03 12:40:37.269: E/AndroidRuntime(3185):在 android.widget.FrameLayout.draw(FrameLayout.java:357) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1921) 07-03 12:40:37.269: E/AndroidRuntime(3185): 在 android.view.ViewRoot.draw(ViewRoot.java:1528) 07-03 12:40:37.269: E/AndroidRuntime(3185):在 android.view.ViewRoot.performTraversals(ViewRoot.java:1264) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.view.ViewRoot.handleMessage(ViewRoot.java:1866) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.os.Handler.dispatchMessage(Handler.java:99) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 android.os.Looper.loop(Looper.java:130) 07-03 12:40:37.269: E/AndroidRuntime(3185):在 android.app.ActivityThread.main(ActivityThread.java:3687) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 java.lang.reflect.Method.invokeNative(Native Method) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 java.lang.reflect.Method.invoke(Method.java:507) 07-03 12:40:37.269: E/AndroidRuntime(3185):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 07-03 12:40:37.269: E/AndroidRuntime(3185): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 07-03 12:40:37.269:E/AndroidRuntime(3185):在 dalvik.system.NativeStart.main(Native Method)
【问题讨论】:
标签: android canvas bitmap thumbnails runtimeexception