Java Android-使用Firebase的实时聊天应用程序
我正在构建一个基于firebase数据库的实时聊天应用程序 因此,我的问题是,每次应用程序调用oncreat方法时,我都会调用displaychatmessages()方法,而我的数据库中的所有消息都会显示在我的listview上。 我的问题是,当数据库变大时,应用程序会面临一些问题吗??几个月或几年后??我的意思是,它将在开始时处理大量数据 作为一个解决方案,我尝试将旧消息存储在本地,稍后再加载,应用程序将只加载新添加的child?但是我不知道怎么开始如果这是个好主意有人能帮我吗 我以前的displayChatMessages方法: 有没有新的想法Java Android-使用Firebase的实时聊天应用程序,java,android,sqlite,firebase,android-recyclerview,Java,Android,Sqlite,Firebase,Android Recyclerview,我正在构建一个基于firebase数据库的实时聊天应用程序 因此,我的问题是,每次应用程序调用oncreat方法时,我都会调用displaychatmessages()方法,而我的数据库中的所有消息都会显示在我的listview上。 我的问题是,当数据库变大时,应用程序会面临一些问题吗??几个月或几年后??我的意思是,它将在开始时处理大量数据 作为一个解决方案,我尝试将旧消息存储在本地,稍后再加载,应用程序将只加载新添加的child?但是我不知道怎么开始如果这是个好主意有人能帮我吗 我以前的di
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);
}
private void displayChatMessages(){
RecyclerView recycler=(RecyclerView)findViewById(R.id.myRv);
LinearLayoutManager layoutmang=新的LinearLayoutManager(此);
layoutmang.setStackFromEnd(真);
回收商。setLayoutManager(layoutmang);
mAdapter=新的FirebaseRecyclerAdapter(
ChatMessage.class、R.layout.activity\u main、RecyclerView.ViewHolder.class、FirebaseDatabase.getInstance().getReference()){
@凌驾
受保护的void populateViewHolder(最终回收视图。ViewHolder ViewHolder,最终聊天信息用户,
最终int位置){
int y=0;
聊天信息用户2;
如果(位置>1){
user2=getItem(位置-1);
}否则{
user2=getItem(位置);
}
ChatMessage ori2=获取项目(位置);
if(user.getMessageUser().matches(FirebaseAuth.getInstance().getCurrentUser().getEmail())){
如果(user2.getMessageFULL()在聊天应用程序中显示所有消息确实会随着消息数量的增加而导致问题。相反,您可以使用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) {
mAdapter=新的FirebaseRecyclerAdapter(
ChatMessage.class,
R.layout.activity_main,
RecyclerView.ViewHolder.class,
(最近){
非常感谢,它还能工作。我每天都会创建一个解决方案,添加一个新的孩子,所有的消息都会发送到那里,每次用户点击load更多消息,应用程序就会加载当天的消息-我每次点击load more时都会加载更多消息!!请问这是最好的解决方案吗??