【问题标题】:Android - Real Time Chat App Using Firebase [closed]Android - 使用 Firebase 的实时聊天应用程序 [关闭]
【发布时间】:2017-08-20 20:56:44
【问题描述】:

我正在构建一个基于 firebase 数据库的实时聊天应用 所以我的问题是,每次应用程序调用 oncreat 方法时,我都会调用 displaychatmessages() 方法,问题是我的数据库中的所有消息都显示在我的列表视图上。 我的问题是,当数据库变大时,应用程序会面临一些问题吗?几个月或几年后??我的意思是它会在开始时处理大量数据

作为一种解决方案,我试图在本地存储旧消息并稍后加载它们,并且该应用程序将只加载新添加的子项?但如果这是个好主意,我不知道如何开始,有人可以帮助我吗?

我的旧 displayChatMessages 方法: 对新的有什么想法吗??

private void displayChatMessages() {

    RecyclerView recycler = (RecyclerView)findViewById(R.id.myRv);
    LinearLayoutManager layoutmang = new LinearLayoutManager(this);
    layoutmang.setStackFromEnd(true);
    recycler.setLayoutManager(layoutmang);
    mAdapter = new FirebaseRecyclerAdapter<ChatMessage, RecyclerView.ViewHolder>(
            ChatMessage.class, R.layout.activity_main, RecyclerView.ViewHolder.class, FirebaseDatabase.getInstance().getReference()) {
        @Override
        protected void populateViewHolder(final RecyclerView.ViewHolder viewHolder, final ChatMessage user,
                                          final int position) {


            int y=0;
            ChatMessage user2;
            if (position>1){
                user2 = getItem(position - 1);
            }else{
                user2 = getItem(position );
            }

            ChatMessage ori2 = getItem(position );
            if (user.getMessageUser().matches(FirebaseAuth.getInstance().getCurrentUser().getEmail())) {
                    if (user2.getMessageFULL()<ori2.getMessageFULL()){
                    y=1;
                    populateType1((HolderMe) viewHolder, user,  1);
                }else{
                    populateType1((HolderMe) viewHolder, user, 0);
                }

            }else if (!user.getMessageUser().matches(FirebaseAuth.getInstance().getCurrentUser().getEmail())){
               if (user2.getMessageFULL()<ori2.getMessageFULL()){
                    populateType2((HolderYou) viewHolder, user, 1,FirebaseAuth.getInstance().getCurrentUser().getEmail());
                }else{
                    populateType2((HolderYou) viewHolder, user, 0,FirebaseAuth.getInstance().getCurrentUser().getEmail());
                }

            }
            if(user.getMessageTime()< new Date().getTime()) {
                HolderDate vh3 = (HolderDate) viewHolder;
                populateType3(vh3, user, position);
            }
        }

            @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            Log.e("ViewT",viewType+"");
            if (viewType == 1) {
                 View userType1 = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.layout_holder_me, parent, false);
                return new HolderMe(userType1);
            } else{
               View userType2 = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.layout_holder_you, parent, false);
                return new HolderYou(userType2);
            }

        }

        @Override
        public int getItemViewType(int position) {
              ChatMessage user = getItem(position);
            String s = FirebaseAuth.getInstance().getCurrentUser().getEmail();
            if (s.equals(user.getMessageUser())) {
             return 1;
            } else {
                 return 2;
            }

        }

        private void populateType1(HolderMe v, ChatMessage model, int position) {
            v.getTimeView().setText(DateFormat.format("HH:mm",model.getMessageTime()));
            if (position==1) {
                v.getFullDateView().setText(DateFormat.format("dd-MM-yyyy", model.getMessageTime()));
                v.getFullDateView().setVisibility(View.VISIBLE);
            }
                v.getTextv().setText(model.getMessageText());
        }
        private void populateType3(HolderDate vcv, ChatMessage model, int position) {
            vcv.getDate().setText(DateFormat.format("dd-MM-yyyy",model.getMessageTime()));
        }
        private void toaa1( String text) {
            Toast.makeText(ChatActivity.this,text,Toast.LENGTH_LONG).show();
        }
        private void  populateType2(HolderYou vv, ChatMessage model, int position,String username) {
            vv.getTimeView().setText(DateFormat.format("HH:mm",model.getMessageTime()));
            if (position==1) {
                vv.getFullDateView().setVisibility(View.VISIBLE);
                vv.getFullDateView().setText(DateFormat.format("dd-MM-yyyy", model.getMessageTime()));
            }
            vv.getTextv().setText(model.getMessageText());
           if (username.matches("test2@test2.com")) {
                vv.getImageView().setBackgroundResource(R.drawable.userm);
            } else {
                vv.getImageView().setBackgroundResource(R.drawable.usera);
                }
        }

    };
    recycler.setAdapter(mAdapter);
}

【问题讨论】:

    标签: java android sqlite firebase android-recyclerview


    【解决方案1】:

    随着消息数量的增加,在聊天应用程序中显示所有消息确实会导致问题。相反,您可以使用 Firebase 数据库查询来仅显示最新消息。例如:

    DatabaseReference messages = FirebaseDatabase.getInstance().getReference();
    Query recent = messages.orderByKey().limitToLast(100);
    

    然后在你的适配器中使用它:

    mAdapter = new FirebaseRecyclerAdapter<ChatMessage, RecyclerView.ViewHolder>(
            ChatMessage.class, 
            R.layout.activity_main,
            RecyclerView.ViewHolder.class, 
            recent) {
    

    【讨论】:

    • 非常感谢它的工作原理,我每天都创建了一个解决方案,一个新的孩子添加了所有消息,并且每次用户点击加载更多消息时,应用程序都会加载当天的消息 -i 当我每次单击加载更多时都会增加!请问这是最好的解决方案吗??
    猜你喜欢
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    相关资源
    最近更新 更多