Android-Java - преобразование WeakReference <Bitmap>в обычное растровое изображение - PullRequest
2 голосов
/ 29 сентября 2011

Я какое-то время работал над приложением, которое использует много растровых изображений, и я довел его до такой степени, что оно действительно хорошо работает на большинстве устройств, на которых я его тестировал, за исключением более новой бионики дроидов, работающей 2.3.4 * 1001. *

Я получаю сообщение об ошибке нехватки памяти и вижу, что куча растет в 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 ]

4 голосов
/ 30 сентября 2011

Вы делаете вызовы http в своем коде, используя Apache DefaultHttpClient?

Недавно я обнаружил проблему, специфичную для Droid Bionic, которая заставляет его использовать намного больше памяти виртуальной машины, чем другие устройства Android, при загрузке файлов с использованием HttpClient. Это может быть истинной причиной утечек памяти, если вы не испытываете ошибку OutOfMemoryError на других устройствах.

Есть ли у вас какие-либо трассировки стека, которые указывают на ошибку OutOfMemoryEr во время вызова http?

Я считаю, что обходной код, начинающийся со строки 64 в следующем источнике, может отсутствовать в сборке Droid Bionic:

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

Это можно исправить с помощью HttpConnectionParams.setSocketBufferSize (params, 8192) при создании клиента http.

2 голосов
/ 29 сентября 2011
...