5

我正在使用 android 的 Bitmapfun 应用程序来有效地加载位图。但有时在 Bi​​tmapFactory.decodeFileDescriptor() 会发生崩溃。日志cat和函数如下。crash发生在return语句中。请帮助我。在此先感谢。

 public static Bitmap decodeSampledBitmapFromDescriptor(
        FileDescriptor fileDescriptor, int reqWidth, int reqHeight, ImageCache cache) {

    // 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;

    // If we're running on Honeycomb or newer, try to use inBitmap
    if (Utils.hasHoneycomb()) {
        addInBitmapOptions(options, cache);
    }

    return BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options);
}

日志猫

  06-25 14:20:56.055: E/AndroidRuntime(5978): FATAL EXCEPTION: AsyncTask #3
06-25 14:20:56.055: E/AndroidRuntime(5978): java.lang.RuntimeException: An error occured while executing doInBackground()
06-25 14:20:56.055: E/AndroidRuntime(5978):     at com.vbk.vobok.util.AsyncTask$3.done(AsyncTask.java:325)
06-25 14:20:56.055: E/AndroidRuntime(5978):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
06-25 14:20:56.055: E/AndroidRuntime(5978):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
06-25 14:20:56.055: E/AndroidRuntime(5978):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
06-25 14:20:56.055: E/AndroidRuntime(5978):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
06-25 14:20:56.055: E/AndroidRuntime(5978):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
06-25 14:20:56.055: E/AndroidRuntime(5978):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
06-25 14:20:56.055: E/AndroidRuntime(5978):     at java.lang.Thread.run(Thread.java:856)
06-25 14:20:56.055: E/AndroidRuntime(5978): Caused by: java.lang.IllegalArgumentException: Problem decoding into existing bitmap
06-25 14:20:56.055: E/AndroidRuntime(5978):     at android.graphics.BitmapFactory.decodeFileDescriptor(BitmapFactory.java:664)
06-25 14:20:56.055: E/AndroidRuntime(5978):     at com.vbk.vobok.util.ImageResizer.decodeSampledBitmapFromDescriptor(ImageResizer.java:196)
06-25 14:20:56.055: E/AndroidRuntime(5978):     at com.vbk.vobok.util.ImageFetcher.processBitmap(ImageFetcher.java:242)
06-25 14:20:56.055: E/AndroidRuntime(5978):     at com.vbk.vobok.util.ImageFetcher.processBitmap(ImageFetcher.java:255)
06-25 14:20:56.055: E/AndroidRuntime(5978):     at com.vbk.vobok.util.ImageWorker$BitmapWorkerTask.doInBackground(ImageWorker.java:326)
06-25 14:20:56.055: E/AndroidRuntime(5978):     at com.vbk.vobok.util.ImageWorker$BitmapWorkerTask.doInBackground(ImageWorker.java:1)
06-25 14:20:56.055: E/AndroidRuntime(5978):     at com.vbk.vobok.util.AsyncTask$2.call(AsyncTask.java:313)
06-25 14:20:56.055: E/AndroidRuntime(5978):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
06-25 14:20:56.055: E/AndroidRuntime(5978):     ... 4 more
4

4 回答 4

4

我也遇到过同样的问题,我在 删除了方法addInBitmapOptionsImageResizer.java并且修复了错误。

于 2013-10-24T08:05:06.183 回答
2

我使用了 BitMapFun,很遗憾地告诉你,这个项目充满了 bug。例如,在 AsyncTask 中,他们不是从 UiThread 执行 setDrawable(..),而是作为 WeakReferance 的队列工作。这意味着如果用户快速向下滚动,用户将需要很长时间才能看到图像(取决于网络强度)。

关于您的错误,在 Android 2.1-2.3.7 中有一个 Dalvik VM GC 错误,它不会释放本机堆中分配的空间。你必须在你的位图上调用 recycle() 并在你的 imageView 上调用 setDrawable(null),调用 System.gc() 这个 bug 应该可以解决。如果我帮助了你,请告诉我。干杯

于 2013-07-22T17:51:52.363 回答
0

如果您的 android sdk >= 4.0(或高于 4.0,我不确定)为 false,则 options.inSampleSize 必须为 1。

于 2014-02-08T06:25:08.913 回答
0

我和你遇到了同样的情况。但是,我是故意一些数据来产生这种情况的。原因是我被指定了

mImageFetcher = new ImageFetcher(getActivity(), 1024, 683);

我故意显存很大,超出了我设置的显存,我是希望能检测到图像显示乱序,但是没有出现,但是你遇到的情况。所以我建议你可以像这样压缩图像并为 img 设置小比例:

mImageFetcher = new ImageFetcher(getActivity(), 100,100);

于 2013-08-29T06:28:08.503 回答