Я испытываю стресс-тестирование приложения, которое состоит из кучи пользовательских представлений (фактически 3), которые хранятся в frameLayout.Android, из памяти в пользовательском представлении
Только два одновременно проводятся. У меня есть вид 1, добавьте вид два, анимируйте 1 и анимируйте в 2, затем удалите 1, и наоборот, если я пойду взад и вперед, взгляды.
Каждый вид загружает большое количество данных изображения, когда он будет создан, используя следующий метод:
mBmp[background] = BitmapFactory.decodeStream(context.getAssets().open("view1_background.png"));
Ниже приведен пример с моей точки зрения переключения кода, это переключение вперед, к NEXTVIEW.
currView.startAnimation(AnimClass.outToLeftAnimation(null));
intView++;
nextView = ViewFactory.getInstance(this, intView, viewInitializer);
mainLayout.addView(nextView, 0);
nextView.startAnimation(AnimClass.inFromRightAnimation(this));
mainLayout.removeViewInLayout(currView);
currView = nextView;
nextView = null;
viewInitializer вызывает вид пользовательского зависимости от intView и конкретизирует его, который затем загружает изображения с помощью описанного выше метода.
Проблема заключается в том, что если я быстро переключу виды, я могу заставить его перестать поддерживать (даже если я отключу кнопки до завершения анимации слайда), и после нескольких переключений я потеряю большую часть изображения в представлении и просто заканчиваются одним или двумя из самых маленьких изображений. Она не показывает каких-либо ошибок, когда это происходит, за исключением следующих сообщений (одно за изображение в этой точке зрения):
01-27 13:52:00.730: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 139264
01-27 13:52:01.011: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 425984
01-27 13:52:01.011: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 1187840
01-27 13:52:01.011: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 139264
01-27 13:52:01.093: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 139264
01-27 13:52:01.128: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 425984
01-27 13:52:01.144: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 1187840
01-27 13:52:01.179: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 139264
01-27 13:52:01.245: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 425984
01-27 13:52:01.261: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 139264
01-27 13:52:01.277: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 1187840
01-27 13:52:01.343: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 139264
01-27 13:52:01.363: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 425984
01-27 13:52:01.409: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 1187840
01-27 13:52:01.429: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 139264
01-27 13:52:01.511: DEBUG/skia(23064): ------- imageref_ashmem create failed <(null)> 139264
Если я переключаю взгляды, он делает то же самое на каждом представлении. Мне кажется, что мой код переключения просмотров не отменяет представления при их удалении или удалении изображений (растровых изображений) после удаления представления.
Если я затем использовать намерение вернуться к своей основной деятельности я получаю следующее:
Surface E Surface (identity=4810) requestBuffer(0, 00000033) returneda buffer with a null handle
Surface E getBufferLocked(0, 00000033) failed (Out of memory)
Surface E dequeueBuffer failed (Out of memory)
ViewRoot E OutOfResourcesException locking surface
ViewRoot E android.view.Surface$OutOfResourcesException
ViewRoot E at android.view.Surface.lockCanvasNative(Native Method)
ViewRoot E at android.view.Surface.lockCanvas(Surface.java:314)
ViewRoot E at android.view.ViewRoot.draw(ViewRoot.java:1363)
ViewRoot E at android.view.ViewRoot.performTraversals(ViewRoot.java:1172)
ViewRoot E at android.view.ViewRoot.handleMessage(ViewRoot.java:1749)
ViewRoot E at android.os.Handler.dispatchMessage(Handler.java:99)
ViewRoot E at android.os.Looper.loop(Looper.java:123)
ViewRoot E at android.app.ActivityThread.main(ActivityThread.java:4627)
ViewRoot E at java.lang.reflect.Method.invokeNative(Native Method)
ViewRoot E at java.lang.reflect.Method.invoke(Method.java:521)
ViewRoot E at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
ViewRoot E at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
ViewRoot E at dalvik.system.NativeStart.main(Native Method)
Можно ли предположить, где я мог бы пойти не так?
EDIT: Не нашли точной причины, но я решил проблему, выполнив сбор мусора между переключающими видами.
Гамида, ты пробовал использовать SoftReference? – 100rabh
Нет, я не пробовал, потому что из моего понимания это позволило бы системе удалить мои изображения из памяти, даже когда я их использую? Это правильное понимание? Для него неприемлемо удалить изображения, пока мой взгляд все еще находится в фокусе. – Hamid