android-Java-将WeakReference <bitmap>转换为普通的Bitmap </bitmap>

时间:2011-09-29 00:40:55

标签: java android bitmap weak-references

我已经开发了一段时间使用大量Bitmaps的应用程序,并且我已经将它运行到大多数已经测试过它的设备上的工作非常好,除了运行2.3.4的更新的机器人仿生器

我出现内存不足错误,我也可以看到堆在logcat中增长。到目前为止,我已经尝试使用不同的技术重新调整位图的大小,除了新的机器人仿生之外,其他所有设备都非常有用,这很奇怪,你会认为更新的手机可以更好地处理vm。

我看过这里讨论使用各种方法的其他一些线程,但我感兴趣的一个涉及使用WeakReferenced来存储图像。这很棒但是如何将弱引用转换回正常位图以在画布上使用。

编辑:这是最近的堆栈跟踪dumparoo:p

09-30 12:33:09.231  2867  2922 E AndroidRuntime: FATAL EXCEPTION: go
09-30 12:33:09.231  2867  2922 E AndroidRuntime: java.lang.OutOfMemoryError
09-30 12:33:09.231  2867  2922 E AndroidRuntime:    at org.apache.http.impl.io.AbstractSessionInputBuffer.init(AbstractSessionInputBuffer.java:79)
09-30 12:33:09.231  2867  2922 E AndroidRuntime:    at org.apache.http.impl.io.SocketInputBuffer.<init>(SocketInputBuffer.java:93)
09-30 12:33:09.231  2867  2922 E AndroidRuntime:    at org.apache.http.impl.SocketHttpClientConnection.createSessionInputBuffer(SocketHttpClientConnection.java:83)
09-30 12:33:09.231  2867  2922 E AndroidRuntime:    at org.apache.http.impl.conn.DefaultClientConnection.createSessionInputBuffer(DefaultClientConnection.java:170)
09-30 12:33:09.231  2867  2922 E AndroidRuntime:    at org.apache.http.impl.SocketHttpClientConnection.bind(SocketHttpClientConnection.java:106)
09-30 12:33:09.231  2867  2922 E AndroidRuntime:    at org.apache.http.impl.conn.DefaultClientConnection.openCompleted(DefaultClientConnection.java:129)
09-30 12:33:09.231  2867  2922 E AndroidRuntime:    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:177)
09-30 12:33:09.231  2867  2922 E AndroidRuntime:    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
09-30 12:33:09.231  2867  2922 E AndroidRuntime:    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
09-30 12:33:09.231  2867  2922 E AndroidRuntime:    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:363)
09-30 12:33:09.231  2867  2922 E AndroidRuntime:    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
09-30 12:33:09.231  2867  2922 E AndroidRuntime:    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
09-30 12:33:09.231  2867  2922 E AndroidRuntime:    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
09-30 12:33:09.231  2867  2922 E AndroidRuntime:    at graffit.data.ImageGrabber.imagegetter(ImageGrabber.java:164)
09-30 12:33:09.231  2867  2922 E AndroidRuntime:    at graffit.data.ImageGrabber.traverseIDS(ImageGrabber.java:118)
09-30 12:33:09.231  2867  2922 E AndroidRuntime:    at graffit.data.ImageGrabber$getMarkImageThread.run(ImageGrabber.java:238)
09-30 12:33:09.239   480   750 W ActivityManager:   Force finishing activity graffit.main/.GraffView
09-30 12:33:09.669   480   873 I ActivityManager: Process graffit.main (pid 2867) has died.
09-30 12:33:09.677   480   590 I WindowManager: WINDOW DIED Window{407c4100 graffit.main/graffit.main.GraffView paused=true}
09-30 12:33:09.677   480   590 I WindowManager: WINDOW DIED Window{408044e0 Toast paused=false}
09-30 12:33:09.684   480   759 I WindowManager: Setting rotation to 0, animFlags=1

2 个答案:

答案 0 :(得分:4)

您是否使用Apache DefaultHttpClient在代码中进行http调用?

我最近发现了一个特定于Droid Bionic的问题,导致它在使用HttpClient下载文件时比其他Android设备使用更多的VM内存。如果您没有在其他设备上遇到OutOfMemoryError,这可能是导致内存泄漏的真正原因。

在http调用期间,您是否有任何指示OutOfMemoryError的堆栈跟踪?

我相信Droid Bionic版本中可能缺少以下源代码中第64行的解决方法:

http://codesearch.google.com/codesearch#CskViEIa27Y/src/org/apache/http/impl/io/SocketInputBuffer.java&q=package:android.git.kernel.org%20file:org/apache/http/impl/io/SocketInputBuffer.java&l=1

您可以在创建http客户端时使用HttpConnectionParams.setSocketBufferSize(params,8192)解决此问题。

答案 1 :(得分:2)