You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 09:10:29