在RecyclerView Adapter中调用SharedPrefManager获取UID遇空指针求助
嘿,我一眼就揪出你遇到的空指针问题根源了!咱们一步步拆解解决:
问题核心原因
在你的MyCommentAdapter里,你在成员变量位置直接初始化SharedPrefManager:
// 这里的context此时还是null! SharedPrefManager sharedPrefManager = new SharedPrefManager(context); public String uid = sharedPrefManager.getUID();
Java中类的成员变量初始化是在构造函数执行之前的,这时候context还没被构造函数赋值(要等构造函数里this.context = context执行后才有值),所以你传给SharedPrefManager的是null,调用getUID()时自然触发空指针异常。
另外,你的SharedPrefManager用了静态的mContext和sharedPreferences,这种设计也有隐患——多个地方实例化时静态变量会被覆盖,还可能导致内存泄漏(静态context会持有Activity引用,无法被GC回收)。
修复方案
第一步:调整Adapter的初始化时机
把SharedPrefManager、uid和Firebase引用的初始化移到构造函数里,确保拿到有效的context:
public class MyCommentAdapter extends RecyclerView.Adapter<MyCommentAdapter.MyCommentHolder> { Context context; private List<MyComment> commentList; // 先声明变量,不要直接初始化 private SharedPrefManager sharedPrefManager; private String uid; private DatabaseReference mDatabaseReference1; public MyCommentAdapter(Context context, List<MyComment> commentList) { this.context = context; this.commentList = commentList; // 现在context已经有有效值了,再初始化SharedPrefManager sharedPrefManager = new SharedPrefManager(context); uid = sharedPrefManager.getUID(); // 最后初始化Firebase数据库引用 mDatabaseReference1 = FirebaseDatabase.getInstance().getReference() .child("User").child(uid).child("Comment"); } // 你的Adapter其他代码... }
第二步:优化SharedPrefManager的实现(可选但强烈推荐)
把静态变量改成非静态,避免内存泄漏和多实例冲突:
public class SharedPrefManager { private SharedPreferences sharedPreferences; private Context mContext; private static final String PREF_NAME = "sessionPref"; private SharedPreferences.Editor editor; public SharedPrefManager(Context context) { // 用Application Context更安全,避免持有Activity引用导致内存泄漏 mContext = context.getApplicationContext(); sharedPreferences = mContext.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); editor = sharedPreferences.edit(); } public void saveUID(String uid){ editor.putString("UID", uid); editor.apply(); // apply()是异步写入,比commit()性能更好 } public String getUID(){ return sharedPreferences.getString("UID", ""); } public void clear(){ editor.clear(); editor.apply(); } }
这里做了几个关键优化:
- 移除所有静态变量,每个
SharedPrefManager实例持有独立的引用 - 改用全局Application Context,彻底避免Activity内存泄漏风险
- 删掉
saveUID里重复的初始化逻辑,直接复用成员变量 - 把同步写入的
commit()换成异步的apply(),提升性能
这样修改后,不仅彻底解决了空指针问题,还让你的SharedPrefManager更健壮、更安全。
内容的提问来源于stack exchange,提问作者Bikram Nath
相关产品推荐
相关产品推荐

