如何在两个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
相关产品推荐
相关产品推荐

