我有一个列表视图,每行有几个图像按钮.单击列表行时,将启动新活动.由于相机布局有问题,我不得不建立自己的标签.为结果启动的活动是地图.如果我单击我的按钮启动图像预览(从SD卡加载图像),应用程序将从活动返回到活动返回到listview
结果处理程序以重新启动我的新活动,这只是一个图像小部件.
列表视图上的图像预览正在使用光标和ListAdapter
.这使得它非常简单,但我不确定如何放置一个经过调整大小的图像(即小的像素大小不像动态src
图像按钮那样.所以我只是调整了从手机摄像头下来的图像.
问题是当我试图返回并重新启动第二个活动时,我收到内存不足错误.
这是更好的,因为我还需要对每行中的小部件/元素的属性进行一些更改,因为焦点问题我无法选择带触摸屏的行.(我可以用滚球.)
一旦我在列表视图上禁用了图像,它再次正常工作.
仅供参考:这就是我的做法:
String[] from = new String[] { DBHelper.KEY_BUSINESSNAME,DBHelper.KEY_ADDRESS,DBHelper.KEY_CITY,DBHelper.KEY_GPSLONG,DBHelper.KEY_GPSLAT,DBHelper.KEY_IMAGEFILENAME + ""};
int[] to = new int[] {R.id.businessname,R.id.address,R.id.city,R.id.gpslong,R.id.gpslat,R.id.imagefilename };
notes = new SimpleCursorAdapter(this, R.layout.notes_row, c, from, to);
setListAdapter(notes);
Run Code Online (Sandbox Code Playgroud)
哪里R.id.imagefilename
是ButtonImage
.
这是我的LogCat:
01-25 05:05:49.877: ERROR/dalvikvm-heap(3896): 6291456-byte external allocation too large for this process.
01-25 05:05:49.877: ERROR/(3896): VM wont let us allocate 6291456 bytes
01-25 05:05:49.877: ERROR/AndroidRuntime(3896): Uncaught handler: thread main exiting due to …
Run Code Online (Sandbox Code Playgroud) 我有一个OutOfMemory异常,画廊超过600x800像素JPEG.
环境
我一直在使用带有大约600x800像素的JPG图像的Gallery.
由于我的内容可能比图像更复杂,我将每个视图设置为一个RelativeLayout,它将JPView包装在ImageView中.
为了"加速"用户体验,我有一个4个插槽的简单缓存,预取(在一个looper中)左边有1个图像,1个图像右边显示图像并将它们保存在4槽HashMap中.
该平台
我使用的是256 RAM和128堆大小的AVD,屏幕为600x800.它也发生在Entourage Edge目标上,除了使用设备它更难调试.
问题
我一直在例外:
OutofMemoryError: bitmap size exceeds VM budget
Run Code Online (Sandbox Code Playgroud)
并且它在获取第五个图像时发生.我试图改变我的图像缓存的大小,它仍然是相同的.
奇怪的是:应该没有内存问题
为了确保堆限制远离我的需要,我在开始时定义了一个虚拟的8MB数组,并将其保留为未引用,以便立即调度.它是活动线程的成员,定义如下
static { @SuppressWarnings("unused")
byte dummy[] = new byte[ 8*1024*1024 ]; }
Run Code Online (Sandbox Code Playgroud)
结果是堆大小接近11MB并且它们都是免费的. 注意我在它开始崩溃后添加了这个技巧.它使OutOfMemory不那么频繁.
现在,我正在使用DDMS.在崩溃之前(崩溃后变化不大),DDMS显示:
ID Heap Size Allocated Free %Used #Objects
1 11.195 MB 2.428 MB 8.767 MB 21.69% 47,156
Run Code Online (Sandbox Code Playgroud)
并在详细信息表中显示:
Type Count Total Size Smallest Largest Median Average
free 1,536 8.739MB 16B 7.750MB 24B 5.825KB
Run Code Online (Sandbox Code Playgroud)
最大的块是7.7MB.然而LogCat说:
ERROR/dalvikvm-heap(1923): 925200-byte external allocation too large for this process.
Run Code Online (Sandbox Code Playgroud)
如果你介意中位数和平均值之间的关系,可以假设大多数可用的块非常小.但是,有一个块足够大的位图,它是7.7M.怎么还不够呢?
注意:我记录了一个堆跟踪.在查看分配的数据量时,感觉不会超过2M.它确实与DDMS的可用内存报告相匹配. …
我有一些关于Bitmap对象和内存及其一般分类的问题.
在第二次创建位图后,我收到以下错误:
04-17 18:28:09.310: ERROR/AndroidRuntime(3458): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
this._profileBitmap = Bitmap.createBitmap(_profileBitmap, xCoor, yCoor, width, height);
Run Code Online (Sandbox Code Playgroud)
从日志:
04-17 18:27:57.500: INFO/CameraCropView(3458): Original Photo Size: W 1536 x H 2048
04-17 18:28:06.170: INFO/CameraCropView(3458): xCoor: 291
04-17 18:28:06.170: INFO/CameraCropView(3458): yCoor: 430
04-17 18:28:06.170: INFO/CameraCropView(3458): Width: 952
04-17 18:28:06.170: INFO/CameraCropView(3458): Height: 952
Run Code Online (Sandbox Code Playgroud)
由于图像很大,我得到了错误.但有趣的是错误不是第一次发生,只有当我第二次拍摄时才会发生,这让我相信这个profileBitmap不会被破坏.我该如何清理它?
我有一个列表,显示从网上即时下载的缩略图(小图像).在某些时候,该过程耗尽内存.我如何判断可用内存即将耗尽,以便我可以停止下载更多图像?
我想提前知道它,以免陷入内存不足的边缘.
注意:这不是内存泄漏,只是大量下载的位图.
谢谢.
我认为之前有人询问过,但仍有一些我无法理解的事情.
我尝试了两种不同的方法:
在2.它只是清理它们有时第二次我分配它们!而且我没有分配太多 - 30-40张50x50像素的图像.
所以我坚持一个.问题是限制是什么?
大家好我正在开发一个使用许多图像和活动的应用程序.它是一个提供应用程序的数字杂志.在我的应用程序中,我应该使用动态Viewgroup图像和textview动态显示所有杂志给用户使用缩略图.我的应用程序是几乎完成.但我真的在努力解决内存问题.
在我的应用程序中,许多内存泄漏即将到来.我在很多地方管理我可以使用System.gc(); .回收(); hashmap和所有其他可能的方法.但我的应用程序仍有同样的问题.
我想找到我的代码中发生内存泄漏的位置.我使用DDMS分配跟踪器,MAT和Heap仍然只是粗略的想法.我想在我的代码中找到它来管理它.
任何人都可以帮我解决这个问题.我被困在这里,我没有办法.:(
我在垂直LinearLayout中有一系列视图.滚动到时,每个视图都会生成并绘制一个位图.出于性能原因,每次调用onDraw()时我宁愿不生成Bitmap,但出于内存原因,我无法保留对Bitmaps的硬引用.我可以就我应该采取的策略提出建议.
我已经尝试过明显的路径:生成Bitmap,然后用SoftReference包装它.这失败有两个原因.1.参考文献收集得比我预期的要热烈得多.我还是得到了OOM!这是令人震惊的,因为没有Bitmap特别大,所以单个视图不应该导致OOM,让我假设OOM发生,因为违规的SoftReference没有被释放的机会.此外,当我的应用程序的分配堆大小为6mb时(根据DDMS视图),OOM会发生,我希望它在抛出OOM之前增长到16mb.
有什么建议?
在我的应用程序中,我正在从网上下载图像.我得到了外出记忆异常.有人建议使用以下代码清除堆.但我仍然面临着内存不足的例外.任何人都可以帮助我.活动开始时调用以下方法.在这里我指的是这个链接
public void onStart()
{
super.onStart();
//Handling the out of memory exception
logHeap(this.getClass());
}
public static void logHeap(Class clazz) {
Double allocated = new Double(Debug.getNativeHeapAllocatedSize())/new Double((1048576));
Double available = new Double(Debug.getNativeHeapSize()/1048576.0);
Double free = new Double(Debug.getNativeHeapFreeSize()/1048576.0);
DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(2);
df.setMinimumFractionDigits(2);
System.out.println("debug. =================================");
System.out.println("debug.heap native: allocated " + df.format(allocated) + "MB of " + df.format(available) + "MB (" + df.format(free) + "MB free) in [" + clazz.getName().replaceAll("com.myapp.android.","") + "]");
System.out.println("debug.memory: allocated: " + df.format(new Double(Runtime.getRuntime().totalMemory()/1048576)) + "MB …
Run Code Online (Sandbox Code Playgroud) 我的代码:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView iv = new ImageView(mContext);
Drawable photo = new BitmapDrawable(loadBitmap(URL));
iv.setImageDrawable(photo);
iv.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
return iv;
}
private Bitmap loadBitmap(String url) {
try {
Bitmap bm = BitmapFactory.decodeStream((InputStream)this.fetch(url));
return bm;
}
catch(Exception e) {
e.printStackTrace();
return null;
}
}
public Object fetch(String address) {
try {
URL url = new URL(address);
Object content = url.getContent();
return content;
}
catch(Exception e) {
e.printStackTrace();
}
return this;
}
Run Code Online (Sandbox Code Playgroud)
我尝试在图库中查看大约100张带有URL的照片.但是当查看大约10张照片时,发生了内存不足错误.我该怎么做才能避免错误?
我尝试修改getView()如下所示.
@Override
public View …
Run Code Online (Sandbox Code Playgroud)