如果在在不同的Activity 各开启一个Gallery 记忆体释放 oom
时间:2011-10-02
来源:互联网
我的情况是
我有两个页面分别为 A & B
进入顺序是 程式开启→ A page → 点击A page 上的一个button → B page
→ 在B page上按返Button finish掉B → A page
这两个页面都会有一个Gallery来呈现图片
由於我不想把 B page 关掉后, 重新读取 A page的图片
所以在页面转移到 B page的时候 我并没有对 A page 做finish()的动作
问题出现在记忆体释放
在我重复尝试
A → B
B → A
的过程中, 我发现虽然我使用了finish指令 结束掉B
来回的过程记忆体还是越吃越大最后就会 OOM
因为要呈现画廊有使用
ImageAdapter extends BaseAdapter
GalleryFlow extends Gallery
这两个类别 请问我该怎么做才能在关掉B的同时释放记忆体?
我有两个页面分别为 A & B
进入顺序是 程式开启→ A page → 点击A page 上的一个button → B page
→ 在B page上按返Button finish掉B → A page
这两个页面都会有一个Gallery来呈现图片
由於我不想把 B page 关掉后, 重新读取 A page的图片
所以在页面转移到 B page的时候 我并没有对 A page 做finish()的动作
问题出现在记忆体释放
在我重复尝试
A → B
B → A
的过程中, 我发现虽然我使用了finish指令 结束掉B
来回的过程记忆体还是越吃越大最后就会 OOM
因为要呈现画廊有使用
ImageAdapter extends BaseAdapter
GalleryFlow extends Gallery
这两个类别 请问我该怎么做才能在关掉B的同时释放记忆体?
1 |
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import android.content.Context;
//import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.Bitmap.Config;
import android.graphics.PorterDuff.Mode;
import android.graphics.Shader.TileMode;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
//import android.widget.ImageView.ScaleType;
public class ImageAdapter extends BaseAdapter {
int mGalleryItemBackground;
// 接收存放URL阵列之字串阵列
private String[] strImageURL;
private Context mContext;
// URL转成图片后存放View的阵列
HashMap<Integer,ImageView> dataCache = new HashMap<Integer,ImageView>();
public ImageAdapter(Context context, String[] ImageIds) {
mContext = context;
strImageURL = ImageIds;
}
/*一定要覆写的方法getView,传回一View物件*/
public View getView(int position, View convertView, ViewGroup parent) {
final int reflectionGap = 0;
/*产生ImageView物件*/
ImageView imageView = new ImageView(mContext);
try{
// new URL物件将网址传入
// 无限循环-第1点改进, 通过取余数来循环
// 非 无限循环-原码如下
//URL aryURI = new URL(strImageURL[position]);
URL aryURI = new URL(strImageURL[position%strImageURL.length]);
// 取得连线
URLConnection conn = aryURI.openConnection();
conn.connect();
// 取得回传的InputStream
InputStream is = conn.getInputStream();
// 将InputStream变成Bitmap
Bitmap originalImage = BitmapFactory.decodeStream(is);
// 关闭InputStream
is.close();
// 设定Bitmap於ImageView中
imageView.setImageBitmap(originalImage);
// 以下开始处理图片
int width = originalImage.getWidth();
int height = originalImage.getHeight();
Matrix matrix = new Matrix();
// 图片影子
matrix.preScale(1, -1);
// 图片影子大小
Bitmap reflectionImage = Bitmap.createBitmap(originalImage,
0, height/2, width, height/2, matrix, false);
// 图片大小
Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
(height + height / 2), Config.ARGB_8888);
Canvas canvas = new Canvas(bitmapWithReflection);
// 影子的宽
canvas.drawBitmap(originalImage, 0, 0, null);
Paint deafaultPaint = new Paint();
canvas.drawRect(0, height, width, height + reflectionGap,
deafaultPaint);
canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);
Paint paint = new Paint();
LinearGradient shader = new LinearGradient(0,
originalImage.getHeight(), 0, bitmapWithReflection.getHeight()
+ reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP);
paint.setShader(shader);
paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()
+ reflectionGap, paint);
imageView.setImageBitmap(bitmapWithReflection);
// 布景大小
imageView.setLayoutParams(new GalleryFlow.LayoutParams(200, 320));
// 图片皆同size (会切图)
//imageView.setScaleType(ScaleType.MATRIX);
dataCache.put(position, imageView);
} catch (IOException e){
e.printStackTrace();
}
return dataCache.get(position);
}
/*private Resources getResources() {
// TODO Auto-generated method stub
return null;}*/
public int getCount() {
// 无限循环-第2点改进, 传回一个很的数值,例如,Integer.MAX_VALUE
return Integer.MAX_VALUE;
// 非 无限循环-原码应如下
//return strImageURL.length;
}
/*一定要覆写的方法getItemId,传回position*/
public Object getItem(int position) {
return position;
}
/*一定要覆写的方法getItem,传回position*/
public long getItemId(int position) {
return position;
}
/* 依据距离中央的位移量 利用getScale回传Views的大小(0.0f to 1.0f) */
public float getScale(boolean focused, int offset) {
return Math.max(0, 1.0f / (float) Math.pow(2, Math.abs(offset)));
}
}
|
1 |
import android.content.Context;
import android.graphics.Camera;
import android.graphics.Matrix;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.Transformation;
import android.widget.Gallery;
import android.widget.ImageView;
public class GalleryFlow extends Gallery {
private Camera mCamera = new Camera(); private int mMaxRotationAngle = 60; private int mMaxZoom = -120; private int mCoveflowCenter; public GalleryFlow(Context context) { super(context); this.setStaticTransformationsEnabled(true); }
public GalleryFlow(Context context, AttributeSet attrs) { super(context, attrs); this.setStaticTransformationsEnabled(true); }
public GalleryFlow(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.setStaticTransformationsEnabled(true); }
public int getMaxRotationAngle() { return mMaxRotationAngle; }
public void setMaxRotationAngle(int maxRotationAngle) { mMaxRotationAngle = maxRotationAngle; }
public int getMaxZoom() { return mMaxZoom; }
public void setMaxZoom(int maxZoom) { mMaxZoom = maxZoom; }
private int getCenterOfCoverflow() { return (getWidth() - getPaddingLeft() - getPaddingRight()) / 2 + getPaddingLeft(); } //显示视窗大小 private static int getCenterOfView(View view) { return view.getLeft() + view.getWidth() / 2; }
protected boolean getChildStaticTransformation(View child, Transformation t) {
final int childCenter = getCenterOfView(child); final int childWidth = child.getWidth(); int rotationAngle = 0;
t.clear(); t.setTransformationType(Transformation.TYPE_MATRIX);
if (childCenter == mCoveflowCenter) { transformImageBitmap((ImageView) child, t, 0); } else { rotationAngle = (int) (((float) (mCoveflowCenter - childCenter) / childWidth) * mMaxRotationAngle); if (Math.abs(rotationAngle) > mMaxRotationAngle) { rotationAngle = (rotationAngle < 0) ? -mMaxRotationAngle : mMaxRotationAngle; } transformImageBitmap((ImageView) child, t, rotationAngle); }
return true; }
protected void onSizeChanged(int w, int h, int oldw, int oldh) { mCoveflowCenter = getCenterOfCoverflow(); super.onSizeChanged(w, h, oldw, oldh); }
private void transformImageBitmap(ImageView child, Transformation t, int rotationAngle) { mCamera.save(); final Matrix imageMatrix = t.getMatrix(); final int imageHeight = child.getLayoutParams().height; final int imageWidth = child.getLayoutParams().width; final int rotation = Math.abs(rotationAngle);
// 图片的上边界
// 在Z轴上正向移动camera的视角,实际效果为放大图片
|
作者: polo54786 发布时间: 2011-10-02
可能得看一下你Activity怎么写的
看起来你adapter跟gallery没有leak的状况
所以可能是Activity内有点问题?
另外提供一个方式可能有点花时间但是也能让你找到问题
使用Eclipse DDMS有个符号可以dump hprof file,
你帮Eclipse装上memory analyzer http://www.eclipse.org/mat/
就可以蛮方便帮你检查物件间的关系..
koji
看起来你adapter跟gallery没有leak的状况
所以可能是Activity内有点问题?
另外提供一个方式可能有点花时间但是也能让你找到问题
使用Eclipse DDMS有个符号可以dump hprof file,
你帮Eclipse装上memory analyzer http://www.eclipse.org/mat/
就可以蛮方便帮你检查物件间的关系..
koji
作者: koji 发布时间: 2011-10-02
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28















