Android 无法立即从Firebase实时数据库检索数据。它只在发送消息后才会出现

Android 无法立即从Firebase实时数据库检索数据。它只在发送消息后才会出现,android,firebase,firebase-realtime-database,messages,Android,Firebase,Firebase Realtime Database,Messages,我真的很难立即从Firebase检索消息。我已经建立了一个聊天应用程序,但是历史记录只在记录了一条消息后才下载。当我打开聊天活动时,他们不会下载。有人能帮我吗 下面你可以看到我的聊天类负责做所有的逻辑 package br.sosqueen.com.sosqueen; import android.graphics.Color; import android.graphics.Typeface; import android.os.Bundle; import android.support.

我真的很难立即从Firebase检索消息。我已经建立了一个聊天应用程序,但是历史记录只在记录了一条消息后才下载。当我打开聊天活动时,他们不会下载。有人能帮我吗

下面你可以看到我的聊天类负责做所有的逻辑

package br.sosqueen.com.sosqueen;

import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;

import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.GenericTypeIndicator;
import com.google.firebase.database.ValueEventListener;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by calvin.
 */

public class Chat extends AppCompatActivity {

    private LinearLayout layout;
    private EditText messageArea;
    private ScrollView scrollView;

    DatabaseReference reference1 = FirebaseDatabase.getInstance()
            .getReferenceFromUrl("https://sosqueen-6b80b.firebaseio.com/" + UserDetails.username + "_" + UserDetails.chatWith);
    DatabaseReference reference2 = FirebaseDatabase.getInstance()
            .getReferenceFromUrl("https://sosqueen-6b80b.firebaseio.com/" + UserDetails.chatWith + "_" + UserDetails.username);

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_chat);

        layout = (LinearLayout) findViewById(R.id.layout1);
        messageArea = (EditText) findViewById(R.id.messageArea);
        scrollView = (ScrollView) findViewById(R.id.scrollView);

        getSupportActionBar().setTitle(UserDetails.chatWith);

    public void sendMessage(View view) {
        String messageText = messageArea.getText().toString();

        if(! messageText.equals("")){
            Map<String, String> map = new HashMap<String, String>();
            map.put("message", messageText);
            map.put("user", UserDetails.username);
            reference1.push().setValue(map);
            reference2.push().setValue(map);
        }

        reference1.addChildEventListener(new ChildEventListener() {

            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                GenericTypeIndicator<Map<String, String>> genericTypeIndicator = new GenericTypeIndicator<Map<String, String>>() {};
                Map<String, String> map = dataSnapshot.getValue(genericTypeIndicator );
                String message = map.get("message").toString();
                String userName = map.get("user").toString();

                if(userName.equals(UserDetails.username)){
                    addMessageBox(message, 1);
                }
                else{
                    addMessageBox(message, 2);
                }
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

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

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }

        });
        messageArea.setText("");
    }

    public void addMessageBox(String message, int type) {
        TextView textView = new TextView(Chat.this);
        textView.setText(message);
        LinearLayout.LayoutParams linearP = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        linearP.setMargins(10, 0, 0, 10);
        textView.setLayoutParams(linearP);
        textView.setTypeface(Typeface.create("sans-serif-thin", Typeface.NORMAL));
        textView.setTextSize(20);

        if(type == 1) {
            linearP.gravity = Gravity.END;
            textView.setTextColor(Color.WHITE);
            textView.setBackgroundResource(R.drawable.rounded_corner1);
            textView.setPadding(20,20,20,20);
            scrollView.post(new Runnable()
            {
                public void run()
                {
                    scrollView.fullScroll(View.FOCUS_DOWN);
                }
            });

        } else {
            textView.setTextColor(Color.BLACK);
            textView.setBackgroundResource(R.drawable.rounded_corner2);
            textView.setPadding(20,20,20,20);
            scrollView.post(new Runnable()
            {
                public void run()
                {
                    scrollView.fullScroll(View.FOCUS_DOWN);
                }
            });
        }

        layout.addView(textView);
    }
}
package br.sosquen.com.sosquen;
导入android.graphics.Color;
导入android.graphics.Typeface;
导入android.os.Bundle;
导入android.support.annotation.Nullable;
导入android.support.v7.app.AppActivity;
导入android.view.Gravity;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.EditText;
导入android.widget.LinearLayout;
导入android.widget.ScrollView;
导入android.widget.TextView;
导入com.google.firebase.database.ChildEventListener;
导入com.google.firebase.database.DataSnapshot;
导入com.google.firebase.database.DatabaseError;
导入com.google.firebase.database.DatabaseReference;
导入com.google.firebase.database.FirebaseDatabase;
导入com.google.firebase.database.GenericTypeIndicator;
导入com.google.firebase.database.ValueEventListener;
导入java.util.HashMap;
导入java.util.Map;
/**
*由卡尔文创作。
*/
公共类聊天扩展了AppCompative活动{
私人线路布局;
私人编辑区;
私有滚动视图滚动视图;
DatabaseReference reference1=FirebaseDatabase.getInstance()
.getReferenceFromUrl(“https://sosqueen-6b80b.firebaseio.com/“+UserDetails.username+”\u“+UserDetails.chatWith);
DatabaseReference reference2=FirebaseDatabase.getInstance()
.getReferenceFromUrl(“https://sosqueen-6b80b.firebaseio.com/“+UserDetails.chatWith+”“+UserDetails.username);
@凌驾
创建时受保护的void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u chat);
布局=(线性布局)findViewById(R.id.layout1);
messageArea=(EditText)findViewById(R.id.messageArea);
scrollView=(scrollView)findViewById(R.id.scrollView);
getSupportActionBar().setTitle(UserDetails.chatWith);
公共无效发送消息(查看){
字符串messageText=messageArea.getText().toString();
如果(!messageText.equals(“”){
Map Map=newhashmap();
map.put(“message”,messageText);
map.put(“用户”,UserDetails.username);
reference1.push().setValue(映射);
reference2.push().setValue(map);
}
reference1.addChildEventListener(新的ChildEventListener(){
@凌驾
公共void onChildAdded(DataSnapshot DataSnapshot,字符串s){
GenericTypeIndicator GenericTypeIndicator=新的GenericTypeIndicator(){};
Map Map=dataSnapshot.getValue(genericTypeIndicator);
String message=map.get(“message”).toString();
字符串userName=map.get(“用户”).toString();
if(userName.equals(UserDetails.userName)){
addMessageBox(消息,1);
}
否则{
addMessageBox(消息,2);
}
}
@凌驾
公共void onChildChanged(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
ChildRemoved上的公共void(DataSnapshot DataSnapshot){
}
@凌驾
已移动ChildMoved上的公共void(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
messageArea.setText(“”);
}
public void addMessageBox(字符串消息,int类型){
TextView TextView=新的TextView(Chat.this);
textView.setText(消息);
LinearLayout.LayoutParams linearP=新的LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_内容,ViewGroup.LayoutParams.WRAP_内容);
线性相对设置边距(10,0,0,10);
textView.setLayoutParams(linearP);
setTypeface(Typeface.create(“sans serif thin”,Typeface.NORMAL));
textView.setTextSize(20);
如果(类型==1){
linearP.gravity=gravity.END;
textView.setTextColor(Color.WHITE);
textView.setBackgroundResource(R.drawable.rounded_corner1);
设置填充(20,20,20,20);
scrollView.post(新的Runnable()
{
公开募捐
{
滚动视图。完全滚动(视图。焦点向下);
}
});
}否则{
textView.setTextColor(Color.BLACK);
textView.setBackgroundResource(R.drawable.rounded_corner2);
设置填充(20,20,20,20);
scrollView.post(新的Runnable()
{
公开募捐
{
滚动视图。完全滚动(视图。焦点向下);
}
});
}
layout.addView(textView);
}
}
这是我创建的使用Firebase进行聊天逻辑的类。
问题是,当我单击发送消息时,所有历史记录都会出现,但当我打开聊天活动时,它们不会下载。

要检索所有数据,必须使用
ValueEventListener
而不是
ChildEventListener

值事件侦听器将在
DatabaseReference
变量中的指定位置检索所有数据

请记住,
ValueEventListener
将始终检索给定位置的所有子项,即使只有一个子项发生了更改,因此,如果希望只发生一次,则应使用
addListenerForSingleValueEvent

对于更新,我认为您可以保留当前代码

见:

和:

没有,但我想再试一次