ChildEventListener, вызывающий IndexOutOfBoundsException - PullRequest
0 голосов
/ 07 июня 2019

Я разрабатываю приложение, где люди могут отправлять сообщения друг другу.Когда я отправляю сообщение моему получателю, возникает ошибка IndexOutOfBoundsException, как описано ниже

        --------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: mychatapp.mychatapp.com.mychatapp, PID: 15377
    java.lang.IndexOutOfBoundsException: Index: 10, Size: 7
        at java.util.ArrayList.set(ArrayList.java:427)
        at mychatapp.mychatapp.com.mychatapp.Activity.ChatActivity$9.onChildChanged(ChatActivity.java:575)
        at com.google.firebase.database.core.ChildEventRegistration.fireEvent(com.google.firebase:firebase-database@@16.1.0:82)
        at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@16.1.0:63)
        at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@16.1.0:55)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6316)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)
Application terminated.

my ChildEventListener

private void recuperarMensagens(){
    listaMensagens.clear();
    childEventListenerMsgs = mensagensReference.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            Mensagem mensagem = dataSnapshot.getValue( Mensagem.class );
            String key = dataSnapshot.getKey();
            listaKeys.add(key);
            listaMensagens.add( mensagem );

            if (!listaMensagens.isEmpty() &&
                    listaMensagens.contains(mensagem)){

                DatabaseReference msgRef = databaseReference.
                        child("mensagens").child(idUsuarioDestinatario)
                        .child(idUsuarioLogado)
                        .child(key)
                        .child("visualizado");
                msgRef.setValue(true);

            }

            mensagensAdapter.notifyDataSetChanged();
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            Mensagem mensagem = dataSnapshot.getValue(Mensagem.class);
            String key = dataSnapshot.getKey();
            int index = listaKeys.indexOf(key);
            listaMensagens.set(index,mensagem);
            mensagensAdapter.notifyDataSetChanged();
        }

Строка 575 равна

listaMensagens.set(index,mensagem);

Какисправить эту ошибку? Заранее спасибо

ОБНОВЛЕНИЕ: Я думаю, что при добавлении нового элемента он дублируется до выхода и снова выходит на экран.С предыдущими пунктами все в порядке.

ОБНОВЛЕНИЕ 2: исправлена ​​ошибка с дублирующимися элементами, но проблема сохраняется

Ответы [ 2 ]

0 голосов
/ 08 июня 2019

Я понял, что ошибка произошла, главным образом, когда я запустил Intent и возвратил действие. Поэтому я добавил listaKeys.clear () к методу onPause, и проблема была исправлена.

@Override
protected void onPause() {
    super.onPause();
    listaKeys.clear();
}
0 голосов
/ 07 июня 2019

вы пытаетесь добавить элемент в ваш массив с индексом 10, но ваш размер массива равен 7, поэтому для его исправления выдается IndexOutOfBoundsException:

  • , если вы неНе забудьте указать значение индекса, просто добавьте размер в ваш массив:

    ArrayList<yourObject> array =new ArrayList<yourObject>(100);
    

или, если вы не хотите указывать размер, просто попробуйте добавить элемент с индексом, превосходящим на единицудо размера

int theIndex = listaMensagens.size() + 1 ; 
listaMensagens.set(theIndex,mensagem);

, таким образом, обеспечивается безопасный доступ к позиции 8 и исключений не будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...