outofmemoryerror 관련은 정말 많은 거 알고 있습니다
근데 정말 모르겠어서 이렇게 질문합니다!
제가 구현하는 어플은 탭호스트로 거의 하나의 액티비티라고 보시면 될 것 같습니다
처음화면에서 리스트를 보여주고 리스트 클릭시 Viewer로 이동하게 됩니다.
Viewer에서 이미지가 bitmap 배열로 저장되고 뷰페이져를 통해서 구현하였습니다
여기서 아래 두 이미지는 버튼클릭시 화면이 바뀌도록 구현하였습니다
여기서 다시 되돌아 갈 경우 메모리 에러가 뜹니다 ㅠㅠ 바로 뜨지는 않고 몇번 스와이프하다보면
메모리 에러가 ㅠㅠ
그래서 recycle을 온리쥼에도 해봤고 온펄스부분에도 해봤는데 널포인익셉션에러가 뜨네요 ㅠㅠ
oncreate 부분에는 저 어싱크테스크가 없고 resume 부분에만 존재하면 어싱크테스크 안에서 뷰페이저로 뿌려주고 있습니다
설명이 너무 어려운데 부탁드립니다 ㅠㅠ
@Override
public void onResume()
{
super.onResume();
//bit = new Bitmap[Integer.parseInt(Worklist.selItem.image)];
file_path = Worklist.selItem.file_path;
new ImageTask().execute(0);
Log.i("check", "onresuem");
new ImageTask().execute(1);
}
댓글감사합니다~
bitmap을 재생성하기보다는 덮여쓴다는 말이 맞을거 같으넫 이런식으로 하면 문제가 있나요??
그리고 그냥 처음에 스와이프 할 경우는 에러가 안나는데
.
Intent intent = new Intent(Property.this, Viewer.class);
LocalActivityManager activityManager =getLocalActivityManager();
Window window = activityManager.startActivity("test",intent);
setContentView(window.getDecorView());
다시 이미지가 있는 화면으로 넘어왔을 시에 에러가 납니다
jelly님 말대로 쓰레드에서 이미지 로딩 중인데 다른데서 recycle하려니 널포인익셉션이 뜨는건 맞는거 같네요 ㅠㅠ
해결방법은 모색해봐야겠엉쇼,,,
우선....
주석처리 되신부분이긴 한데 실제 로식에서
bit = new Bitmap[Integer.parseInt(Worklist.selItem.image)];
이렇게 사용하시는거면...
이걸로 인해서 나중에 또 outofmemoryerror 발생할 소지가 있을거 같구요
스와이프 하다보면 계속 bitmap을 재생성만 하고 recycle을 안하셔서 그런거 같습니다.
onPause 제대로 recycle을 하셨다면 null이 나올리가 없을텐데요...
아마 이미지 로딩을 쓰레드에서 처리 하셔서 그런거 같은데요
쓰레드에서 이미지 로딩 중인데 onPause에서 recycle을 하려고 하시면 당연히 null이겠죠...(onResume에서 처리 하셔도...)
onPause에서 recycle을 하기 전에 new ImageTask().execute(0); 에서 로딩중인 이미지를 취소하고 이미 로딩된 이미지를 recycle처리 한수 onPause에서 한번더 체크 하시는게 맞을거 같습니다.