相关疑难解决方法(0)

将图像加载到Bitmap对象时出现奇怪的内存不足问题

我有一个列表视图,每行有几个图像按钮.单击列表行时,将启动新活动.由于相机布局有问题,我不得不建立自己的标签.为结果启动的活动是地图.如果我单击我的按钮启动图像预览(从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.imagefilenameButtonImage.

这是我的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)

android image bitmap out-of-memory android-bitmap

1252
推荐指数
33
解决办法
60万
查看次数

在Android中检测应用程序堆大小

如何以编程方式检测Android应用程序可用的应用程序堆大小?

我听说有一个功能可以在SDK的更高版本中执行此操作.无论如何,我正在寻找适合1.5及以上的解决方案.

memory heap android heap-memory

143
推荐指数
5
解决办法
10万
查看次数

String在Java中可容纳的最大数据量是多少?

我知道这可能是一个非常愚蠢的问题,但我找不到可靠的资源,我可以获得这些信息.

在Android应用程序中,我试图通过继续向其附加更多数据来保存String中的数据.最后,当用户关闭应用程序或点击"保存按钮"时,我将其记录到数据.csv文件中.

我想知道java中有多少数据可以容纳一个简单的String?,因此,如果String数据类型耗尽分配的内存,应用程序不会崩溃.BTW我试图强调测试我的应用程序,无论我在一个字符串中存储多少数据,它似乎运行正常.

平硐

java android

27
推荐指数
3
解决办法
5万
查看次数

在Android 4中启用android:largeHeap,并在Android 2.3中禁用它

目前,我有一段代码,设计用于在Android 2.3和4+中运行

如果android:largeHeap在AndroidManifest.xml中应用代码,代码将执行得更好(大多数情况下它不会有OutOfMemory异常).

<application
    android:name=".MyApplication"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:screenOrientation="nosensor"
    android:largeHeap="true"
Run Code Online (Sandbox Code Playgroud)

目前,我android:minSdkVersion需要设置为15而不是10(Android 2.3).如果没有,android:largeHeap则在AndroidManifest.xml中不允许.

<uses-sdk
    android:minSdkVersion="15"
    android:targetSdkVersion="15" />
Run Code Online (Sandbox Code Playgroud)

在单个APK中,我可以设置多少

  • android:largeHeap如果我在Android 4+中使用选项
  • android:largeHeap如果我在Android 2.3中,请不要使用选项

android

20
推荐指数
2
解决办法
2万
查看次数

由于堆大小增加导致android内存不足

我没有内存错误.我正在进行实时聊天应用程序.它运行正常,但是当我在设备上运行应用程序1到2个小时时,堆大小正在增加,当它达到16 MB时,应用程序开始挂起并在一段时间后崩溃并显示,out of memory due to heap size因为生成的堆大小大于分配.

我在HTC Explorer上测试我的应用程序.在我的应用程序中,大多数活动都使用后台线程,因为我正在使用Asnyc Task.

我收到如下错误.

04-30 16:53:14.658: E/AndroidRuntime(5707): FATAL EXCEPTION: MagentoBackground
04-30 16:53:14.658: E/AndroidRuntime(5707): java.lang.OutOfMemoryError: (Heap Size=20167KB, Allocated=16063KB, Bitmap Size=355KB)
04-30 16:53:14.658: E/AndroidRuntime(5707):     at org.apache.http.util.ByteArrayBuffer.<init>(ByteArrayBuffer.java:53)
04-30 16:53:14.658: E/AndroidRuntime(5707):     at org.apache.http.impl.io.AbstractSessionInputBuffer.init(AbstractSessionInputBuffer.java:82)
04-30 16:53:14.658: E/AndroidRuntime(5707):     at org.apache.http.impl.io.SocketInputBuffer.<init>(SocketInputBuffer.java:98)
04-30 16:53:14.658: E/AndroidRuntime(5707):     at org.apache.http.impl.SocketHttpClientConnection.createSessionInputBuffer(SocketHttpClientConnection.java:83)
04-30 16:53:14.658: E/AndroidRuntime(5707):     at org.apache.http.impl.conn.DefaultClientConnection.createSessionInputBuffer(DefaultClientConnection.java:170)
04-30 16:53:14.658: E/AndroidRuntime(5707):     at org.apache.http.impl.SocketHttpClientConnection.bind(SocketHttpClientConnection.java:106)
04-30 16:53:14.658: E/AndroidRuntime(5707):     at org.apache.http.impl.conn.DefaultClientConnection.openCompleted(DefaultClientConnection.java:129)
04-30 16:53:14.658: E/AndroidRuntime(5707):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:173)
04-30 16:53:14.658: E/AndroidRuntime(5707):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
04-30 16:53:14.658: E/AndroidRuntime(5707):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
04-30 …
Run Code Online (Sandbox Code Playgroud)

android out-of-memory

13
推荐指数
3
解决办法
2万
查看次数

Android:LibGDX 2D游戏内存消耗

我在使用libGDX开发2D游戏时遇到了一些内存消耗问题.

这是一款具有丰富图形内容的2D游戏 - 有许多纹理,动画,字体等.出于某些原因,所有图形内容都是在游戏开始时加载的 - 这是内存问题.我已经在不同的设备上测试了内存分配(本机和堆)并得到了不同的结果:(我已经按照纹理大小划分了所有设备组)

第1组(纹理采用~840*480屏幕)

HTC Desire(Froyo): 178Mb(本机) - 12Mb(堆) - 应用程序加载成功

HTC One V(ICS): 30Mb(本机) - 12Mb(堆) - 应用程序成功加载

HTC Desire S(Jelly Bean): 30Mb(本机) - 12Mb(堆) - 应用程序加载成功

第2组(纹理采用~1366*768屏幕)

三星(谷歌)Galaxy Nexus 329Mb(原生) - 18Mb(堆) - 效果很好

Galaxy TAB(Honeycomb) 164Mb(本机) - 10Mb(堆) - 应用程序崩溃(Surface.OutOfResouresException).

我认为在所有Android版本上可能存在一些重要的内存管理差异,这给我带来了这些麻烦.

任何人都可以解释在Android 3.x上加载纹理时究竟发生了什么?或者发布一些链接以了解解决此问题需要采取的措施.

一些更新

Toady我在3.x仿真器上做了一些额外的测试(我知道这不是最好的方法,但是之前的日志类似于emu和Galaxy Tab)

  1. 我使用1024*600采用的纹理运行游戏 - 80%加载资源上的应用程序崩溃(158本机内存分配)
  2. 纹理为800*480 - 100%加载时应用程序崩溃(145Mb本机内存分配)

最后我在新的谷歌Nexus平板电脑(Jelly Bean)上运行应用程序,该平板电脑使用与3.x平板电脑(1280*800px)相同的纹理 - 约30Mb本机内存和~12Mb vm堆.

现在我完全不了解正在发生的事情 - 相同的内存分配为纹理800*480和1280*800 ......

最后

我已经使用一些进度条按需加载资源解决了这种情况.在所有的尝试后,我没有找到另一种方式.

memory android opengl-es libgdx

7
推荐指数
1
解决办法
4311
查看次数

Android版本的堆大小是否最小?

很多帖子都谈到了Android堆大小,到目前为止我发现的最大堆大小的唯一常见的事情是它至少有16MB,但这是自API 3以来的限制.对于使用更多内存,人们会建议使用NDK或任何超出"正常"Android开发的东西.

是否有任何Android版本要求设备具有更大的堆大小,以便我可以开始假设更大的那个并停止在内存上如此便宜?

在清单中是否还要求大堆的标志(来自API 11 - 蜂窝),或者是一个模糊的请求,设备甚至可能忽略它?

多年来,Android硬件已经有了很大的改进,但我们仍然需要在内存上如此便宜,即使设备现在有超过1GB的内存.奇怪的是,我们不能要求操作系统为我们提供特定数量的堆大小,并承诺我们不会再使用它了.

android memory-management heap-size

7
推荐指数
1
解决办法
3466
查看次数

如何在没有OutOfMemory错误的情况下从FileInputStream获取字节数组

我有一个拥有200MB数据的FileInputStream.我必须从输入流中检索字节.

我正在使用下面的代码将InputStream转换为字节数组.

private byte[] convertStreamToByteArray(InputStream inputStream) {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    try {
        int i;
        while ((i = inputStream.read()) > 0) {
            bos.write(i);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return bos.toByteArray();
}
Run Code Online (Sandbox Code Playgroud)

在将如此大的数据转换为字节数组时,我得到了OutOfMemory异常.

请告诉我将InputStream转换为字节数组的任何可能的解决方案.

java android

3
推荐指数
2
解决办法
7561
查看次数