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

在RecyclerView Adapter中调用SharedPrefManager获取UID遇空指针求助

解决RecyclerView Adapter中调用SharedPrefManager的空指针问题

嘿,我一眼就揪出你遇到的空指针问题根源了!咱们一步步拆解解决:

问题核心原因

在你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:49:48