最近遇到一个前人留下坑,如下报错。
java.lang.RuntimeException: Canvas: trying to draw too large(268435456bytes) bitmap.
09-20 17:06:39.298 26126 26126 E AndroidRuntime: at android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:229)
09-20 17:06:39.298 26126 26126 E AndroidRuntime: at android.view.RecordingCanvas.drawBitmap(RecordingCanvas.java:98)
09-20 17:06:39.298 26126 26126 E AndroidRuntime: at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:545)
09-20 17:06:39.298 26126 26126 E AndroidRuntime: at android.widget.ImageView.onDraw(ImageView.java:1360)
09-20 17:06:39.298 26126 26126 E AndroidRuntime: at android.view.View.draw(View.java:20211)
09-20 17:06:39.298 26126 26126 E AndroidRuntime: at android.view.View.updateDisplayListIfDirty(View.java:19086)
09-20 17:06:39.298 26126 26126 E AndroidRuntime: at android.view.View.draw(View.java:19939)
09-20 17:06:39.298 26126 26126 E AndroidRuntime: at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
09-20 17:06:39.298 26126 26126 E AndroidRuntime: at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
09-20 17:06:39.298 26126 26126 E AndroidRuntime: at android.view.View.draw(View.java:20214)
09-20 17:06:39.298 26126 26126 E AndroidRuntime: at android.view.View.updateDisplayListIfDirty(View.java:19086)
问题原因:
ListView刷图片时每次都取本地图片并做一系列压缩等操作,但压缩没有做好导致压缩完成后图片还是很大,发生了上面的Crash.
下面我贴一下问题代码:
该代码有如下几个问题:
1.图片没有缓存每次加载都要压缩计算
2.直接开启线程,没有使用线程池
3.压缩方法写死了,防缩比例计算有问题
4.防缩后没有对图片进行大小压缩
private void loadBitmapsTask(String path,ImageView imageView){
new Thread(new Runnable() {
@Override
public void run() {
Bitmap bitmap = getImage(path);
runOnUiThread(new Runnable() {
@Override
public void run() {
if(imageView != null && bitmap !=null){
ImageView imageViewImage = imageView;
if(imageViewImage != null){
imageViewImage.setImageBitmap(bitmap);
}
}
}
});
}
}).start();
}
private static Bitmap getImage(String srcPath){
BitmapFactory.Options newopts = new BitmapFactory.Options();
//返回bitmap尺寸
newopts.inJustDecodeBounds = true;
BitmapFactory.decodeFile(srcPath,newopts);
//获取bitmap宽高
int w = newopts.outWidth;
int h = newopts.outHeight;
float resolutionH = 80f;
float resolutionW = 80f;
int be = 1;
if(w > h && w>resolutionW){
be = (int)(w/res