stackOverflower错误

vfwfrxfs  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(523)

我在valueeventlistener中得到了一个stackoverflower错误,我不知道为什么,因为我删除了侦听器。似乎与调用setvalue()有关。这是密码

  1. public void joinGame(final String gameId)
  2. {
  3. System.out.println("join");
  4. mtGames.child(gameId).addValueEventListener(new ValueEventListener() {
  5. @Override
  6. public void onDataChange(@NonNull DataSnapshot snapshot) {
  7. Game game = snapshot.getValue(Game.class);
  8. game.addPlayer(mProfile);
  9. mProfile.setGame(game);
  10. mtGames.child(gameId).setValue(mProfile.getGame()); // The error occurs on this line
  11. mtGames.removeEventListener(this);
  12. }
  13. @Override
  14. public void onCancelled(@NonNull DatabaseError error) {
  15. }
  16. });
  17. }

可能是我用的那种听众吗?我的一个想法是,由于它是一个addvalueeventlistener,所以在ondatachange()中将元素添加到数据库中后,它会不断被调用。但是,我在数据库中没有看到这种行为,代码块似乎不会被多次调用,我删除了侦听器。我不太清楚为什么会这样。
以下是控制台输出:

  1. E/AndroidRuntime: FATAL EXCEPTION: main
  2. Process: skateboard.skate, PID: 10127
  3. java.lang.StackOverflowError: stack size 8192KB
  4. at java.util.HashMap$HashIterator.<init>(HashMap.java:1423)
  5. at java.util.HashMap$ValueIterator.<init>(HashMap.java:1468)
  6. at java.util.HashMap$Values.iterator(HashMap.java:968)
  7. at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.serialize(CustomClassMapper.java:652)
  8. at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.serialize(CustomClassMapper.java:167)
  9. at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.access$200(CustomClassMapper.java:47)
  10. at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.serialize(CustomClassMapper.java:675)
  11. at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.serialize(CustomClassMapper.java:167)
  12. at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.access$200(CustomClassMapper.java:47)
  13. ...
  14. at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.serialize(CustomClassMapper.java:675)
  15. at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.serialize(CustomClassMapper.java:167)
  16. at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.access$200(CustomClassMapper.java:47)
  17. at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.serialize(CustomClassMapper.java:675)
  18. at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.serialize(CustomClassMapper.java:167)
  19. at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToPlainJavaTypes(CustomClassMapper.java:60)
  20. at com.google.firebase.database.DatabaseReference.setValueInternal(DatabaseReference.java:282)
  21. at com.google.firebase.database.DatabaseReference.setValue(DatabaseReference.java:159)
  22. at skateboard.skate.MainActivity$2.onDataChange(MainActivity.java:155)
  23. at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)
  24. at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)
  25. at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)
  26. at android.os.Handler.handleCallback(Handler.java:883)
  27. at android.os.Handler.dispatchMessage(Handler.java:100)
  28. at android.os.Looper.loop(Looper.java:237)
  29. at android.app.ActivityThread.main(ActivityThread.java:8125)
  30. at java.lang.reflect.Method.invoke(Native Method)
  31. at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
  32. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
fquxozlt

fquxozlt1#

你会得到无限的递归,这会侵 eclipse 你的堆栈空间。

  1. @Override
  2. public void onDataChange(@NonNull DataSnapshot snapshot) {
  3. Game game = snapshot.getValue(Game.class);
  4. game.addPlayer(mProfile);
  5. mProfile.setGame(game);
  6. mtGames.child(gameId).setValue(mProfile.getGame()); // <-- changes data, triggering onDataChange to be invoked.
  7. mtGames.removeEventListener(this); // <-- happens too late.
  8. }

修复可能类似于:

  1. @Override
  2. public void onDataChange(@NonNull DataSnapshot snapshot) {
  3. Game game = snapshot.getValue(Game.class);
  4. if (mProfile.getGame() != game)
  5. {
  6. game.addPlayer(mProfile);
  7. mProfile.setGame(game);
  8. mtGames.child(gameId).setValue(mProfile.getGame());
  9. }
  10. }
展开查看全部

相关问题