我从我的服务器下载了一些图像并在列表视图中使用它们。确认图像已经实际下载(通过服务)后,我使用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问题,因为没有打印此类日志且问题是间歇性的。我打印文件大小只是为了再次确认它的存在,它也是一个有效的值。而且,这个问题在某些设备上是可重现的,而不是全部。我是在一个单独的线程中加载图像而不是在主线程上加载。
答案 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)
我建议您使用Glide或Picassa之类的外部库来进行图像下载,缓存和显示。无论如何,如果您选择不使用其中一个库,我建议您在网络调用或获取图像的组件上创建一个侦听器,然后在将文件的可用性广播到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
。
它将在大图像中执行此操作,其中位图将变为可用内存的大。
使用较小的图像。