美文网首页android 技术收集
Android不同页面间数据同步

Android不同页面间数据同步

作者: knock_knock | 来源:发表于2016-11-04 17:46 被阅读153次

场景:

你可能遇到过类似的情况:同一条数据在多个页面上展示,并且这些页面同时存在,在其中某一个页面上修改数据,其他页面能够及时更新。我在工作当中就遇到了一个类似的场景:我们APP内部做了一个论坛,每条帖子都可以被点赞,可以在列表页点赞也可以在详情页点赞。以前只有一个列表页,一个详情页,所以直接通过startActivityForResult和onActivityResult就可以在返回列表页的时候更新列表页的状态。后来又增加了一个列表页,跟前一个列表页有重复数据,上面的那个方法就玩不转了,只得另外在想办法。本文就是从这个问题出发,提出一个解决同类问题的通用方法。

架构:

核心思想:

  1. 借助EventBus构建一个Publish/Subscribe系统
  2. 每个页面就是一个Observer,向EventBus订阅自己感兴趣的事件;
  3. 当数据对象(Subject)发生改变,发布(Publish)一个事件出来;
  4. 页面接收到事件更新自己持有的数据、修改页面展示。

实现:

  1. 事件基类:
public class BaseEvent {
    public String uuid;
    public BaseEvent(String uuid){
        this.uuid = uuid;
    }
    public BaseEvent(){}

    public boolean isMe(String me){
        if(TextUtils.isEmpty(uuid)){
            return true;
        }
        return me.equals(uuid);
    }
}
  1. 事件样例:
public class PraiseEvent extends BaseEvent {
    public String data;
    public PraiseEvent(String uuid,String data){
        super(uuid);
        this.data = data;
    }
}
  1. 页面处理样例:(这里展示了RecyclerView当中更新数据的做法)
public void onEventMainThread(PraiseEvent event) {
        int count = recyclerView.getChildCount()-1;
        for(int i=0;i<count;i++){
            View child = recyclerView.getChildAt(i);
            if(child.getTag() != null){
                ItemViewHolder holder = (ItemViewHolder) child.getTag();
                if(event.isMe(holder.data.getId())){
                    Data data = holder.data;
                    String target = event.data;
                    if (target.equals(data.getIsLike())) {
                        return;
                    }
                    data.setIsLike(target);
                    holder.binding.ivLike.setImageResource("Y".equals(data.getIsLike()) ?
                       R.drawable.ic_like_normal :
                       R.drawable.ic_like_pressed);
                    return;
                }
            }
        }

        int size = datas.size();
        for(int i = 0;i<size;i++){
            Data data = datas.get(i);
            if(event.isMe(data.getId())){
                String target = event.data;
                if (target.equals(data.getIsLike())) {
                    return;
                }
                data.setIsLike(target);
                return;
            }
        }
    }

可能存在的问题:

本方案把所有的subscriber都注册到了默认的EventBus实例上,可能会影响性能。如果应用模块划分比较明确,可以为每个模块单独分配一个EventBus实例。

相关文章

网友评论

    本文标题:Android不同页面间数据同步

    本文链接:https://www.haomeiwen.com/subject/vedwuttx.html