BitmapFactory.decodeFile间歇性地返回null

时间:2016-11-07 20:17:14

标签: android listview bitmap runnable

我从我的服务器下载了一些图像并在列表视图中使用它们。确认图像已经实际下载(通过服务)后,我使用BitmapFactory.decodeFile()将它们加载到Bitmap对象。该函数间歇性地返回null。

如果我刷新片段,图像会正确加载到位图中。我在第一次下载后主要观察到这一点虽然这不一致。如果已经下载了图像,有时会观察到这种情况。

以下是我使用的代码:

@Override
    public void run() {

        while (!downImageFile.exists()) {

            try {
                Thread.sleep(1000); // Waits for 1 second (1000 milliseconds)
            } catch (InterruptedException e) {
                Log.e(LOG_TAG, "Exception", e);
            }
        }
        Log.v(LOG_TAG,"Image downloaded now "+downImageFile.getAbsolutePath());
        //String updateWords = updateAuto(); // make updateAuto() return a string
        imageView.post(new Runnable() {
            @Override
            public void run() {
                    Bitmap bm = BitmapFactory.decodeFile(downImageFile.getAbsolutePath());
                    if(bm==null){
                        Log.v(LOG_TAG,"Buzz image is null. Size is "+downImageFile.length()+"  "+downImageFile.getAbsolutePath());
                    }
                    imageView.setImageBitmap(bm);
                }
                imageView.setVisibility(View.VISIBLE);
        });
    }

以下是相关日志:

11-08 01:32:41.290 32245-32245/com.halobee.main D/skia: --- decoder->decode returned false
11-08 01:32:41.290 32245-32245/com.halobee.main V/BeaconCustomList: Buzz image is null. Size is 255458  /data/user/0/com.halobee.main/files/buzz/hbuzz_b251149098404ebeb1198a5ac03087af20161107110912.jpg

这不是OutOfMemory问题,因为没有打印此类日志且问题是间歇性的。我打印文件大小只是为了再次确认它的存在,它也是一个有效的值。而且,这个问题在某些设备上是可重现的,而不是全部。我是在一个单独的线程中加载图像而不是在主线程上加载。

4 个答案:

答案 0 :(得分:0)

1)您可以使用库来帮助您解决此问题,例如Volley,Picaso和许多其他Android库

2)尝试将像素数据从位图复制到' intArray'数组,因为这可能有助于处理更大的文件

  // copy pixel data from the Bitmap into the 'intArray' array
                    bm.getPixels(intArray, 0, bm.getWidth(), 0, 0, bm.getWidth(),
                            bm.getHeight());

答案 1 :(得分:0)

我建议您使用GlidePicassa之类的外部库来进行图像下载,缓存和显示。无论如何,如果您选择不使用其中一个库,我建议您在网络调用或获取图像的组件上创建一个侦听器,然后在将文件的可用性广播到Fragment之后再执行解码部分。 / p>

答案 2 :(得分:0)

您的位图返回null可能有更多原因。首先确保您已在清单中提供了WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE权限,以及Internet权限。 Android 6及更高版本(SDK 23)也有一些变化。尝试将build.gradle中的目标SDK更改为22。

答案 3 :(得分:0)

Bitmap.decodeFile(). 

该函数间歇性地返回null

它将在大图像中执行此操作,其中位图将变为可用内存的大。

使用较小的图像。

相关问题