Android Java Firestore OnComplete无法将ArrayList传递至Activity类
解决Firestore异步获取数据后返回空列表的问题
你遇到的核心问题是Firestore的数据库操作是异步执行的:当调用getTitle()方法时,db.collection("diary").get()会在后台线程跑,而你的方法会直接返回初始化的空titleInformation;等回调onComplete触发并填充数据时,Activity里的代码早就执行完了,所以拿到的自然是空列表。
下面是具体的解决方案,用回调接口传递异步获取到的数据:
1. 修改GetDiaryInformation类,添加回调接口
public class GetDiaryInformation { // 定义回调接口,用于传递数据结果 public interface OnTitleLoadedListener { void onTitleLoaded(ArrayList<String> titles); void onLoadFailed(String errorMessage); } public void getTitle(OnTitleLoadedListener listener){ FirebaseFirestore db = FirebaseFirestore.getInstance(); db.collection("diary").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { ArrayList<String> titleInformation = new ArrayList<>(); if(task.isSuccessful()){ for (QueryDocumentSnapshot document : task.getResult()) { titleInformation.add(document.get("title").toString()); } // 数据获取成功,通过回调返回给调用方 listener.onTitleLoaded(titleInformation); } else { String errorMsg = task.getException() != null ? task.getException().getMessage() : "加载失败:未知错误"; listener.onLoadFailed(errorMsg); } } }); } }
2. 修改ReadDiary Activity的调用逻辑
在Activity里实现回调接口,确保在数据真正加载完成后再处理:
public class ReadDiary extends AppCompatActivity { GetDiaryInformation data; ArrayList<String> titleInformation = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_read_diary); getSupportActionBar().setTitle("Read Your Diaries"); data = new GetDiaryInformation(); // 调用getTitle并传入回调实例 data.getTitle(new GetDiaryInformation.OnTitleLoadedListener() { @Override public void onTitleLoaded(ArrayList<String> titles) { titleInformation = titles; // 这里才是数据真正准备好的地方,在这里处理数据/更新UI Log.d("NEPTUN", String.valueOf(titleInformation.size())); for (String title : titleInformation) { Log.d("MARS", title); } } @Override public void onLoadFailed(String errorMessage) { Log.d("EXCEPTION", errorMessage); // 处理加载失败的情况,比如给用户弹出提示 } }); } }
补充说明
- Firestore的
addOnCompleteListener默认在主线程执行,所以你可以直接在onTitleLoaded里更新UI,不需要额外切换线程。 - 如果你之前尝试接口时出错,大概率是没把回调实例正确传递给获取数据的方法,或者错误地在回调外部直接调用返回值(那时候数据还没加载)。
内容的提问来源于stack exchange,提问作者Ömer
相关产品推荐
相关产品推荐

