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

如何在两个Activity之间获取同一个Realm实例?

嘿,我看你贴了自己的Application实现代码,还有一个被两个Activity共用的RecyclerView Adapter(第一个是普通文章列表场景),先帮你把代码规整好,再聊聊这个共用Adapter的实用优化思路吧!

格式化后的MyApp代码

public class MyApp extends MultiDexApplication {
    private static MyApp instance;

    private static class LazyHolder {
        private static final Realm INSTANCE = Realm.getDefaultInstance();
    }

    public static Realm getRealm() {
        return LazyHolder.INSTANCE;
    }

    public static Context getContext() {
        return instance;
    }

    @Override
    public void onCreate() {
        instance = this;
        super.onCreate();
        Realm.init(this);
    }
}

关于共用RecyclerView Adapter的优化建议

针对两个Activity共用Adapter的场景,咱们可以通过抽象通用逻辑+差异化扩展的方式,避免重复代码同时保持灵活性:

  • 抽离通用基类,封装重复逻辑
    把两个列表都用到的ViewHolder创建、基础数据绑定(比如文章标题、发布时间)放到基类Adapter里,只把每个页面特有的逻辑留给子类实现:
public abstract class BaseArticleAdapter extends RecyclerView.Adapter<BaseArticleAdapter.ArticleViewHolder> {
    protected List<Article> mArticleList;
    protected Context mContext;

    public BaseArticleAdapter(Context context, List<Article> articleList) {
        mContext = context;
        mArticleList = articleList;
    }

    @NonNull
    @Override
    public ArticleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(mContext)
                .inflate(R.layout.item_article_common, parent, false);
        return new ArticleViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull ArticleViewHolder holder, int position) {
        Article article = mArticleList.get(position);
        // 通用数据绑定:所有页面都需要展示的内容
        holder.tvArticleTitle.setText(article.getTitle());
        holder.tvPublishTime.setText(article.getPublishTime());
        // 留给子类处理差异化UI/逻辑
        bindSpecialContent(holder, article, position);
    }

    // 抽象方法:子类实现自己的特殊绑定逻辑
    protected abstract void bindSpecialContent(ArticleViewHolder holder, Article article, int position);

    @Override
    public int getItemCount() {
        return mArticleList == null ? 0 : mArticleList.size();
    }

    // 通用ViewHolder
    public static class ArticleViewHolder extends RecyclerView.ViewHolder {
        TextView tvArticleTitle;
        TextView tvPublishTime;
        // 其他通用控件...

        public ArticleViewHolder(@NonNull View itemView) {
            super(itemView);
            tvArticleTitle = itemView.findViewById(R.id.tv_article_title);
            tvPublishTime = itemView.findViewById(R.id.tv_publish_time);
            // 初始化其他通用控件
        }
    }
}
  • 用接口回调处理不同页面的交互逻辑
    如果两个Activity对列表项的点击、长按逻辑不一样,绝对别在Adapter里直接写Activity的跳转或者业务代码,用接口回调解耦:
// 在BaseArticleAdapter里添加点击回调接口
public interface OnArticleInteractionListener {
    void onArticleClick(Article article);
    void onArticleLongClick(Article article);
}

private OnArticleInteractionListener mInteractionListener;

public void setOnArticleInteractionListener(OnArticleInteractionListener listener) {
    mInteractionListener = listener;
}

// 在ViewHolder里绑定点击事件,触发回调
public ArticleViewHolder(@NonNull View itemView) {
    super(itemView);
    // ...初始化控件
    itemView.setOnClickListener(v -> {
        int position = getAdapterPosition();
        if (position != RecyclerView.NO_POSITION && mInteractionListener != null) {
            mInteractionListener.onArticleClick(mArticleList.get(position));
        }
    });
}

然后在普通文章列表的Activity里,这样使用Adapter:

// 创建Adapter时实现差异化逻辑
BaseArticleAdapter articleAdapter = new BaseArticleAdapter(this, articleDataList) {
    @Override
    protected void bindSpecialContent(ArticleViewHolder holder, Article article, int position) {
        // 普通列表的特殊处理:比如隐藏"置顶"标签
        holder.tvTopTag.setVisibility(View.GONE);
    }
};
// 设置点击回调
articleAdapter.setOnArticleInteractionListener(new BaseArticleAdapter.OnArticleInteractionListener() {
    @Override
    public void onArticleClick(Article article) {
        // 普通列表点击逻辑:跳转到文章详情页
        Intent detailIntent = new Intent(ArticleListActivity.this, ArticleDetailActivity.class);
        detailIntent.putExtra("ARTICLE_ID", article.getId());
        startActivity(detailIntent);
    }

    @Override
    public void onArticleLongClick(Article article) {
        // 普通列表长按逻辑:比如弹出收藏菜单
        showCollectMenu(article);
    }
});
mRecyclerView.setAdapter(articleAdapter);

关于你的Realm单例小提醒

你用懒加载Holder实现的Realm单例挺优雅的,但别忘了在App退出时关闭Realm实例,避免内存泄漏:

@Override
public void onTerminate() {
    super.onTerminate();
    if (LazyHolder.INSTANCE != null && !LazyHolder.INSTANCE.isClosed()) {
        LazyHolder.INSTANCE.close();
    }
}

内容的提问来源于stack exchange,提问作者01hanst

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:40:57