Firebase RealtimeDatabase в приложении чата не получает сообщения по времени - PullRequest
0 голосов
/ 20 апреля 2019

a photo Когда я извлекал сообщения для чата из Firebase, он получал их без времени, отправленного в нем

я пробовал orderbychild (отметка времени); но это не сработало для моего случая

    Intent intent;
    List<ChatModel> data;
    private RecyclerView mRecy;
    ChatAdapter chatAdapter;
    String mId;
    Button sendmessage;
    private EditText mEditWriteMessage;
    FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
    ChatModel chatModel;
    ChatModel chatModel2;




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mechanic_profile);
        sendmessage = findViewById(R.id.sendmessage);
        mEditWriteMessage = findViewById(R.id.editWriteMessage);
        intent = getIntent();
        data = new ArrayList<>();
        chatAdapter = new ChatAdapter(getApplicationContext(), data);
        mRecy = findViewById(R.id.recy);

        mRecy.setHasFixedSize(true);


        mRecy.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
        mRecy.setAdapter(chatAdapter);

        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("CHHAATS");

        DatabaseReference databaseReference1 = FirebaseDatabase.getInstance().getReference("CHHAATS");

        databaseReference1.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
        for(DataSnapshot snapshot  : dataSnapshot.getChildren()) {
    chatModel2 = snapshot.getValue(ChatModel.class);

    if (chatModel2.getFrom().equals(firebaseUser.getUid()) && chatModel2.getTo().equals(intent.getStringExtra("receiver"))
            || chatModel2.getFrom().equals(intent.getStringExtra("receiver")) && chatModel2.getTo().equals(firebaseUser.getUid())) {


        data.add(chatModel2);

    }


            chatAdapter.notifyDataSetChanged();

            mRecy.scrollToPosition(data.size() - 1);

        }
    }



    @Override
    public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
        for(DataSnapshot snapshot  : dataSnapshot.getChildren()) {

            chatModel2 = snapshot.getValue(ChatModel.class);
        }
            if (chatModel2.getFrom().equals(firebaseUser.getUid()) && chatModel2.getTo().equals(intent.getStringExtra("receiver"))
                    || chatModel2.getFrom().equals(intent.getStringExtra("receiver")) && chatModel2.getTo().equals(firebaseUser.getUid())) {


                data.add(chatModel2);



            chatAdapter.notifyDataSetChanged();

            mRecy.scrollToPosition(data.size() - 1);

        }

    }

    @Override
    public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

    }

    @Override
    public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
});

        sendmessage.setOnClickListener(new View.OnClickListener()

            {
                @Override
                public void onClick (View v){
                String message = mEditWriteMessage.getText().toString();
                String receiver = intent.getStringExtra("receiver");
                String sender = firebaseUser.getUid();
                meth(message, receiver, sender);
            }
            });
        }

        void meth (String message, String receiver, String sender){

            DatabaseReference reference = FirebaseDatabase.getInstance().getReference("CHHAATS");
            HashMap<String, Object> hashMap = new HashMap<>();

            hashMap.put("text", message);
            hashMap.put("from", sender);
            hashMap.put("to", receiver);
            reference.child(receiver).push().setValue(hashMap);


        }


    }





фактический результат - получение сообщений без учета времени. мне нужно получить сообщение по дате и времени, но firebase делает другое дело

Ответы [ 2 ]

0 голосов
/ 20 апреля 2019

ОК, я думаю, что все сообщения будут упорядочены по последней версии, поэтому я думаю, что проблема в RecyclerView, и я думаю, что решение в RecyclerView тоже.

после загрузки всех сообщений в RecyclerView должно бытьпоставить эту строку:

mRecy.smoothScrollToPosition(mRecy.getAdapter().getItemCount());

Надеюсь, это поможет вам:)

0 голосов
/ 20 апреля 2019

Вы, вероятно, хотите использовать FCM вместо базы данных в реальном времени.

onChildAdded будет срабатывать на каждом отдельном устройстве, когда пользователь отправляет сообщение, это проблема безопасности и очень плохо сказывается на производительности. Представьте, что вы отправляете 1к сообщений каждую секунду, это сделает ваше приложение очень медленно.

Мой совет - сохранить идентификатор базы данных каждого пользователя в базе данных, а затем использовать этот идентификатор для отправки уведомления этому конкретному пользователю. Для получения сообщений просмотрите FCM .

Для отправки сообщений мой совет будет аутентифицировать пользователя на вашем сервере, используя маркер входа, с сервера вы можете запросить Firebase, чтобы отправить сообщение. ссылка вы также можете использовать функции Firebase, просто храните ваш api_key в надежном месте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...