android - 未在 arrayList 中添加的项目
问题描述
我使用 firebase firestore 来存储一些数据。我将数据存储在 TimeForm 活动中。
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
globalClass.setAction(actionText);
globalClass.setTime(totalTime);
globalClass.setUser_email(user.getEmail());
ScheduleClass scheduleClass = new ScheduleClass(fromEditText.getText().toString() + " - " + untilEditText.getText().toString(), multiLineEditText.getText().toString(), user.getEmail());
Map<String, Object> userMap = new HashMap<>();
userMap.put("Time", globalClass.getTime());
userMap.put("Action", globalClass.getAction());
userMap.put("user_email", globalClass.getUser_email());
mondayCollectionReference = db.collection("Monday");
tuesdayCollectionReference = db.collection("Tuesday");
mondayCollectionReference.document().set(userMap, SetOptions.merge()).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(TimeForm.this, "Submitted", Toast.LENGTH_SHORT).show();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d("ERROR", e.getMessage());
}
});
一切都在这里完美运行,数据以我想要的格式存储。然后我在 MainActivity 检索数据。因此,在 TimeForm 中,用户添加了 15:00 - 17:00 之类的时间,但他添加了多个时间,而在 MainActivity 中,我将所有时间都存储在 ArrayList 中。这是代码:
db = FirebaseFirestore.getInstance();
final ArrayList<String> loadMondayTimeArrayList = new ArrayList<>();
user = FirebaseAuth.getInstance().getCurrentUser();
db.collection("Monday").addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot documentSnapshots, @Nullable FirebaseFirestoreException e) {
for(DocumentSnapshot documentSnapshot : documentSnapshots){
String time;
String action;
String user_email;
time = documentSnapshot.getString("Time");
action = documentSnapshot.getString("Action");
user_email = documentSnapshot.getString("user_email");
mondayTimeArrayList.add(time);
}
}
});
当我在 addSnapShotListener 中记录时间时,它会完美地记录时间。但是,当我将时间添加到 mondayTimeArrayList 并尝试在 addSnapShotListener 之外记录 mondayTimeArrayList 的项目时,我得到一个 Index Out Of Bounds 错误。
解决方案
那是因为添加快照侦听器是异步的,并且该方法会立即返回。在调用回调并成功完成之前,您的数组不会被填充。如果你想使用你的监听器的结果,你将只能在监听器完全完成后才能访问它们。
推荐阅读
- endianness - 我可以在 qiskit 中将字节顺序从小端更改为大端吗?
- java - 在单元测试中在 Lombok 实例化之前加载 Spring Boot 组件
- ruby-on-rails - 运行迁移时没有将 nil 隐式转换为 String (TypeError)
- python-3.x - 连接断开的点:“连接被'ReadTimeoutError(“HTTPSConnectionPool(host ='pypi.org',port = 443)破坏:读取超时。”
- python - 根据数列重新排列数组元素并用数组id表示
- powershell - 检查进程是否在多台远程计算机上运行,如果进程没有运行,则复制文件,保留成功的列表
- php - 我正在尝试通过其他卡创建条带令牌,但它显示您必须提供条带元素或有效令牌类型才能创建令牌
- oracle - Oracle apex 创建只读面包屑条目
- c - 在 Flash 中定义一个数组
- javascript - 如何防止滚动到div的底部?