Java操作Firestore时ApiFuture添加监听器需传入什么Runnable?
解决方案
你不需要直接使用addListener方法传入Runnable,官方更推荐使用ApiFutures.addCallback工具方法实现非阻塞的回调处理,无需手动调用future.get()阻塞或处理异常捕获逻辑,该方法在你当前引入的firebase-admin依赖中已直接可用。
1. 写入操作(WriteResult)监听器实现
导入必要类:
import com.google.api.core.ApiFutureCallback; import com.google.api.core.ApiFutures; import com.google.common.util.concurrent.MoreExecutors;
替换你原有的addListener代码为以下实现:
ApiFutures.addCallback(future, new ApiFutureCallback<WriteResult>() { @Override public void onSuccess(WriteResult result) { // 写入成功逻辑,可直接获取WriteResult的相关属性 // 示例:获取写入时间 result.getUpdateTime() } @Override public void onFailure(Throwable t) { // 写入失败逻辑,可直接处理异常信息 // 示例:打印错误日志 t.printStackTrace() } }, MoreExecutors.directExecutor());
如果你坚持要使用原生addListener传入Runnable的写法,参考实现如下(不推荐):
future.addListener(new Runnable() { @Override public void run() { try { WriteResult result = future.get(); // 处理返回结果 } catch (InterruptedException | ExecutionException e) { // 手动处理所有异常 Thread.currentThread().interrupt(); } } }, MoreExecutors.directExecutor());
2. 查询操作(DocumentSnapshot)监听器实现
和写入操作的回调逻辑完全一致,只需要修改泛型类型即可:
ApiFuture<DocumentSnapshot> getFuture = userDoc.get(); ApiFutures.addCallback(getFuture, new ApiFutureCallback<DocumentSnapshot>() { @Override public void onSuccess(DocumentSnapshot snapshot) { if (snapshot.exists()) { // 文档存在,读取对应字段 示例:snapshot.getString("Name") } else { // 文档不存在的处理逻辑 } } @Override public void onFailure(Throwable t) { // 查询失败的异常处理逻辑 } }, MoreExecutors.directExecutor());
补充说明
你搜索到的ApiFuture.addListener()已弃用的说法不准确,该方法本身没有被弃用,只是原生用法需要手动处理异常、结果解析,开发效率低,官方更推荐使用ApiFutures工具类的回调方法。如果你的回调逻辑耗时较长,建议替换MoreExecutors.directExecutor()为自定义线程池,避免阻塞核心IO线程。
内容的提问来源于stack exchange,提问作者Abhijeet Kharatmol
相关产品推荐
相关产品推荐

