ChildEventListener 导致 IndexOutOfBoundsException
ChildEventListener causing IndexOutOfBoundsException
我正在开发一个人们可以互相发送消息的应用程序。当我向收件人发送消息时,出现如下所述的 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.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.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:Fixed 重复项的错误,但问题仍然存在
您正在尝试向数组中的索引 10 添加一个元素,但您的数组大小为 7,因此它抛出 IndexOutOfBoundsException
来修复它:
如果您不确定索引的值,只需在数组中添加一个大小即可:
ArrayList<yourObject> array =new ArrayList<yourObject>(100);
或者如果您不想指定大小,只需尝试在比大小大一的索引处添加元素
int theIndex = listaMensagens.size() + 1 ;
listaMensagens.set(theIndex,mensagem);
这样就保证了8号位被安全访问,不会有任何异常。
我发现错误主要发生在我启动一个Intent并返回activity时。所以我在方法onPause中添加了listaKeys.clear(),问题就解决了。
@Override
protected void onPause() {
super.onPause();
listaKeys.clear();
}
我正在开发一个人们可以互相发送消息的应用程序。当我向收件人发送消息时,出现如下所述的 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.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.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:Fixed 重复项的错误,但问题仍然存在
您正在尝试向数组中的索引 10 添加一个元素,但您的数组大小为 7,因此它抛出 IndexOutOfBoundsException
来修复它:
如果您不确定索引的值,只需在数组中添加一个大小即可:
ArrayList<yourObject> array =new ArrayList<yourObject>(100);
或者如果您不想指定大小,只需尝试在比大小大一的索引处添加元素
int theIndex = listaMensagens.size() + 1 ;
listaMensagens.set(theIndex,mensagem);
这样就保证了8号位被安全访问,不会有任何异常。
我发现错误主要发生在我启动一个Intent并返回activity时。所以我在方法onPause中添加了listaKeys.clear(),问题就解决了。
@Override
protected void onPause() {
super.onPause();
listaKeys.clear();
}