Android开发中Firebase OnCompleteListener内无法访问类成员变量如何解决
问题原因
你代码里的OnCompleteListener是匿名内部类,匿名内部类里使用this关键字时,默认指向的是匿名内部类自身的实例,而不是外层ChatItem类的实例,所以IDE会提示找不到name、pfpPath变量。
解决方法
1. 直接修复报错
明确指定this所属的外层类,将回调里的this.name、this.pfpPath修改为ChatItem.this.name、ChatItem.this.pfpPath,同时注意doc.get()返回的是Object类型,需要强制转换为String避免类型不匹配报错:
@Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if(task.isSuccessful()){ for(QueryDocumentSnapshot doc : task.getResult()){ ChatItem.this.name = (String) doc.get("username"); ChatItem.this.pfpPath = (String) doc.get("profilePic"); } } }
2. 额外逻辑优化建议
Firestore的get()请求是异步执行的,你在构造方法中发起请求后,构造方法会直接执行完成,不会等待请求返回。如果外部在请求完成前调用getName()、getPfpPath(),拿到的会是null值,建议调整实现逻辑:
- 不要在构造方法中执行异步请求,新增单独的初始化方法,传入加载完成回调接口,数据请求成功后再执行后续逻辑
- 给
name、pfpPath设置默认空值,避免空指针异常
完整优化后的示例代码
package com.example.create4me; import androidx.annotation.NonNull; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.firestore.FirebaseFirestore; import com.google.firebase.firestore.QueryDocumentSnapshot; import com.google.firebase.firestore.QuerySnapshot; public class ChatItem { FirebaseFirestore db = FirebaseFirestore.getInstance(); // 设置默认空值 String name = "", pfpPath = "", userID; // 定义加载完成回调接口 public interface OnLoadCompleteListener { void onLoadComplete(); } public ChatItem(String userID){ this.userID = userID; } // 单独拆分异步加载方法 public void loadData(OnLoadCompleteListener listener){ db.collection("users") .whereEqualTo("uuid", this.userID) .get() .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if(task.isSuccessful()){ for(QueryDocumentSnapshot doc : task.getResult()){ ChatItem.this.name = (String) doc.get("username"); ChatItem.this.pfpPath = (String) doc.get("profilePic"); } if(listener != null){ listener.onLoadComplete(); } } } }); } public String getName(){ return this.name; } public String getPfpPath(){ return this.pfpPath; } public String getUserID(){ return this.userID; } }
内容的提问来源于stack exchange,提问作者qwirrr
相关产品推荐
相关产品推荐

