【问题标题】:ChildEventListener causing IndexOutOfBoundsExceptionChildEventListener 导致 IndexOutOfBoundsException
【发布时间】:2019-10-23 07:57:22
【问题描述】:

我正在开发一个人们可以互相发送消息的应用程序。当我向收件人发送消息时,发生 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.

我的 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:修复了重复项目的错误,但问题仍然存在

【问题讨论】:

  • 您共享的代码总是同时向listaKeyslistaMensagens 添加一个项目。所以他们没有办法在这段代码中不同步。我最好的猜测是您正在其他地方更新listaKeyslistaMensagens,而忘记更新另一个。

标签: android firebase-realtime-database android-recyclerview android-adapter indexoutofboundsexception


【解决方案1】:

您正在尝试在索引 10 处向数组添加一个元素,但您的数组大小为 7,因此它会抛出 IndexOutOfBoundsException 来修复它:

  • 如果您不确定索引的值,只需在数组中添加一个大小:

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

或者如果您不想指定大小,请尝试在比大小高一的索引处添加元素

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

这样就可以保证8号位被安全访问,不会有异常。

【讨论】:

    【解决方案2】:

    我意识到错误主要发生在我启动 Intent 并返回活动时。于是我在onPause方法中加入了listaKeys.clear(),问题就解决了。

    @Override
    protected void onPause() {
        super.onPause();
        listaKeys.clear();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 2015-11-13
      • 2013-08-04
      • 2015-11-28
      • 1970-01-01
      相关资源
      最近更新 更多