最近在写安卓SDK的时候,用了线程去绘制图片,然后后面出现了OutOfMemoryError,这是因为图片太大,bitmap分配的内存又小导致的,bug显示的图片如下:
image.png
查了一下相关BitmapFactory.decodeStream的相关api的用法,然后看到了一些方法思路,我代码造成报错的源码如下:
//子线程设置绘制图片,主线程展示(设置图片资源)
private void initAnnouncementBgImages(final View view,final int imageId){
new Thread(new Runnable() {
@Override
public void run() {
// InputStream ins = getActivity().getResources().openRawResource(imageId);
// BitmapFactory.Options options = new BitmapFactory.Options();
// options.inJustDecodeBounds = true;
// final Bitmap copybm = BitmapFactory.decodeStream(ins, null, options);
Bitmap bitmap = BitmapFactory.decodeResource(getActivity().getResources(),imageId);
// final Bitmap copybm = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),bitmap.getConfig());
final Bitmap copybm = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), bitmap.getConfig().ARGB_8888);
Canvas canvas = new Canvas(copybm);
Paint paint = new Paint();
paint.setColor(Color.RED);
canvas.drawBitmap(bitmap, new Matrix(), paint);
Handler mainHandler = new Handler(Looper.getMainLooper());
mainHandler.post(new Runnable() {
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public void run() {
Drawable drawable = new BitmapDrawable(copybm);
view.setBackground(drawable);
}
});
// Bitmap bitmap = null;
// try {
// // 实例化Bitmap
// bitmap = BitmapFactory.decodeFile(path);
// } catch (OutOfMemoryError e) {
// //
// }
// if (bitmap == null) {
// // 如果实例化失败 返回默认的Bitmap对象
// return defaultBitmapMap;
// }
}
}).start();
}
最后我的解决方法如下:就是没有对他回收机制
image.png
private void releaseBitmap (View view){
if(view == null) return;
BitmapDrawable bd = (BitmapDrawable)view.getBackground();
view.setBackgroundResource(0);
// if(bd == null) return;
// bd.setCallback(null);
// bd.getBitmap().recycle();
// 先判断是否已经回收
if(bd != null && !bd.getBitmap().isRecycled()){
// 回收并且置为null
bd.getBitmap().recycle();
bd = null;
}
System.gc();
}
添加了判断回收机制之后,完美解决,大家可以参考下!需要的可以添家我的维新!!!!
网友评论