데이터읽기(동기)강좌에 버그가 있는것 같습니다.

18.06.03 05:56 작성 조회수 95

0

데이터 읽기 (동기) 강좌의

마지막 부분 메모리 누수를 막기위해서 아래와 같이 사용한다고 말씀해 주신 부분에

문제가 있어 보입니다.

테스트해본 결과

문서추가를 눌러서 새로운 문서를 추가해놓고

기존에 문서중 하나를 삭제한 상태에서

새로 추가했던 문서의 필드를 수정할경우 에러가 발생합니다.

DocumentChange.Type.ADDED -> {

realTimeArrayList.add(item.document.toObject(UserDTO::class.java)) // 오브젝트만 담음

realtimeKeyArrayList.add(item.document.id) // 문서의키값만 가져다 담음

}

DocumentChange.Type.MODIFIED -> updateItem(item.document.id, item.document.toObject(UserDTO::class.java))

DocumentChange.Type.REMOVED -> deleteItem(item.document.id)

====================================

06-02 20:45:20.777 3940-3940/com.test.good E/AndroidRuntime: FATAL EXCEPTION: main

Process: com.test.good, PID: 3940

java.lang.IndexOutOfBoundsException: Index: 3, Size: 3

at java.util.ArrayList.set(ArrayList.java:453)

at com.test.good.ReadActivity.updateItem(ReadActivity.kt:87)

at com.test.good.ReadActivity$onCreate$2.onEvent(ReadActivity.kt:73)

at com.test.good.ReadActivity$onCreate$2.onEvent(ReadActivity.kt:16)

at com.google.firebase.firestore.zzi.onEvent(Unknown Source:16)

at com.google.android.gms.internal.zzevc.zza(Unknown Source:6)

at com.google.android.gms.internal.zzevd.run(Unknown Source:6)

at android.os.Handler.handleCallback(Handler.java:789)

at android.os.Handler.dispatchMessage(Handler.java:98)

at android.os.Looper.loop(Looper.java:164)

at android.app.ActivityThread.main(ActivityThread.java:6541)

at java.lang.reflect.Method.invoke(Native Method)

at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

답변 2

·

답변을 작성해보세요.

0

답변주신데로

realTimeKeyArrayList.removeAt(position)

break

를 추가하니까 됩니다~ㅋ;

break 꼭 써줘야 되나 봅니다... break 안써주면 또 다른 에러가 발생하네요^^ㅎㅎ;

0

안녕하세요 하울입니다.
일단 제가 추측되는 에러로는

fun deleteItem(deleteKey: String) {

    for ((position, item) in realTimeKeyArrayList.withIndex())
        if (deleteKey == item) {
            realTimeArrayList.removeAt(position)
            realTimeKeyArrayList.removeAt(position)
            break
        }

}

코드를 이렇게 수정해주시면 에러가 발생되지 않을 것 같습니다.
아마 삭제하는 부분에 두가지 코드를 삭제해야 BoundsException이 발생되지 않을뜻한데 하나만 삭제해서 발생한것 같습니다.
혹시 조치하고 이상이 없다고 말씀해주시면 코드를 보완해 놓도록 하겠습니다.