Firestore获取数据遇两类问题:静态字段警告与空指针异常求助
问题解决指南
1. 解决NullPointerException空指针异常
问题原因
静态变量g_firestore未完成初始化,调用g_firestore.collection("BOOKS")时触发空指针。
修复方案
推荐方案:移除静态Firestore实例,直接在方法内获取单例
FirebaseFirestore本身是单例设计,每次调用FirebaseFirestore.getInstance()都会返回同一个实例,无需用静态变量持有。修改代码如下:
public static List<BookModel> bookList = new ArrayList<>(); public static void LoadBook(MyCompleteListener completeListener){ bookList.clear(); // 直接获取Firestore实例,避免静态变量未初始化问题 FirebaseFirestore firestore = FirebaseFirestore.getInstance(); firestore.collection("BOOKS").get() .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() { @Override public void onSuccess(QuerySnapshot queryDocumentSnapshots) { Map<String, QueryDocumentSnapshot> docList = new ArrayMap<>(); for (QueryDocumentSnapshot doc: queryDocumentSnapshots ){ docList.put(doc.getId(),doc); } QueryDocumentSnapshot bookListDoc = docList.get("Categories"); // 替换assert为实际空判断,避免发布版崩溃 if (bookListDoc == null) { completeListener.onFailure(new Exception("Categories文档不存在")); return; } Long bookCount = bookListDoc.getLong("COUNT"); // 修复循环条件错误:将1<=bookCount改为i<=bookCount for (int i=1; i<= bookCount ;i++){ String bookID = bookListDoc.getString("BOOK"+String.valueOf(i)+"_ID"); QueryDocumentSnapshot bookDoc = docList.get(bookID); if (bookDoc == null) { completeListener.onFailure(new Exception("ID为"+bookID+"的书籍文档不存在")); return; } Long noOfBookLong = bookDoc.getLong("NO_OF_BOOK"); if (noOfBookLong == null) { completeListener.onFailure(new Exception("书籍NO_OF_BOOK字段为空")); return; } int noOfBook = noOfBookLong.intValue(); String bookName = bookDoc.getString("NAME"); String bookType = bookDoc.getString("TYPE"); bookList.add(new BookModel( bookID,bookName,bookType,noOfBook)); } completeListener.onSuccess(); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // 补充失败回调,避免静默失败 completeListener.onFailure(e); } }); }
额外修复点:
- 循环条件错误:原代码
1<= bookCount会导致无限循环,改为i<= bookCount - 移除
assert语句:assert仅在调试模式生效,发布版会跳过,改用if判断处理空值,避免崩溃 - 补充失败回调:在
addOnFailureListener中调用completeListener.onFailure(e),让调用方感知错误
2. 解决“Do not place Android context classes in static fields”警告
问题原因
代码中存在将Android Context(如Activity、Service实例)存储在静态字段中的情况,这会引发内存泄漏风险。
修复方案
检查并移除静态Context字段:排查代码中是否有类似
public static Context mContext;的静态变量,若有则改为非静态,或通过自定义Application类获取全局Context:public class MyApplication extends Application { private static Context appContext; @Override public void onCreate() { super.onCreate(); appContext = getApplicationContext(); } public static Context getAppContext() { return appContext; } }在
AndroidManifest.xml中配置该Application:<application android:name=".MyApplication" ...> </application>之后通过
MyApplication.getAppContext()获取全局Context,避免静态持有Activity/Service的Context。检查回调接口持有情况:若
MyCompleteListener的实现类持有Activity实例,确保在Activity销毁时取消回调引用,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Sarthak Tiwari
相关产品推荐
相关产品推荐

