如何在用户离线时发送图像,就像使用 firebase 的聊天应用程序中的短信一样?
How to send image when user is offline just like the text message in chat app with firebase?
所以 firebase 具有这种离线功能。
因此,每当我发送任何短信时,只要我点击发送,它就会立即显示在我的设备上。它就像一个魅力。
我的问题是,当我尝试发送图像时,它并没有发生。即使我在线,图像也会首先上传到 Firebase 存储。然后图像 url 将存储到 firebase 数据库中。然后它显示给我看。这需要时间,具体取决于文件大小。是否可以在我发送图像并在后台上传后立即在设备上显示图像?
我有一个适配器 class 并在 recyclerView 中检索数据。
这就是我将图像添加到视图的方式(这是在适配器中 class):
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
switch (holder.getItemViewType()){
case 1:
//for text messages
ViewHolder1 viewHolder1 = (ViewHolder1)holder;
viewHolder1.Text.setText(messageList.get(position).getMessage());
break;
case 2:
//for images
ViewHolder2 viewHolder2 = (ViewHolder2)holder;
Glide.with(viewHolder2.Image.getContext())
.load(messageList.get(position).getMessage())
.crossFade()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(viewHolder2.Image);
break;
}
}
这是我上传的方式(在聊天 Activity class 中):
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == CHOOSE_IMAGE && resultCode == Activity.RESULT_OK && data!=null && data.getData()!=null){
uriProfileImage = data.getData();
final StorageReference profileImageRef = FirebaseStorage.getInstance().getReference("message/"+System.currentTimeMillis()+"jpg");
if (uriProfileImage!=null){
profileImageRef.putFile(uriProfileImage).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
profileImageRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
Uri downloadUrl = uri;
profileImageUrl = downloadUrl.toString();
Map messageMap = new HashMap();
messageMap.put("Message", profileImageUrl);
messageMap.put("Type", 2);
Map messageUserMap = new HashMap();
messageUserMap.put(user_ref+"/"+push_id,messageMap);
mRootRef.updateChildren(messageUserMap, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(@Nullable DatabaseError databaseError, @NonNull DatabaseReference databaseReference) {
if (databaseError!=null){
}
}
});
}
});
}
})
});
}
}
}
希望我清楚。任何帮助将不胜感激。
当用户选择他们要上传的图片时,您可以同时执行两个操作。首先,开始上传到存储,其次,获取图像并将其添加到您的视图中。
然后您可以立即向用户提供反馈并显示图像,而无需先往返于服务器。
所以 firebase 具有这种离线功能。
因此,每当我发送任何短信时,只要我点击发送,它就会立即显示在我的设备上。它就像一个魅力。
我的问题是,当我尝试发送图像时,它并没有发生。即使我在线,图像也会首先上传到 Firebase 存储。然后图像 url 将存储到 firebase 数据库中。然后它显示给我看。这需要时间,具体取决于文件大小。是否可以在我发送图像并在后台上传后立即在设备上显示图像?
我有一个适配器 class 并在 recyclerView 中检索数据。
这就是我将图像添加到视图的方式(这是在适配器中 class):
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
switch (holder.getItemViewType()){
case 1:
//for text messages
ViewHolder1 viewHolder1 = (ViewHolder1)holder;
viewHolder1.Text.setText(messageList.get(position).getMessage());
break;
case 2:
//for images
ViewHolder2 viewHolder2 = (ViewHolder2)holder;
Glide.with(viewHolder2.Image.getContext())
.load(messageList.get(position).getMessage())
.crossFade()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(viewHolder2.Image);
break;
}
}
这是我上传的方式(在聊天 Activity class 中):
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == CHOOSE_IMAGE && resultCode == Activity.RESULT_OK && data!=null && data.getData()!=null){
uriProfileImage = data.getData();
final StorageReference profileImageRef = FirebaseStorage.getInstance().getReference("message/"+System.currentTimeMillis()+"jpg");
if (uriProfileImage!=null){
profileImageRef.putFile(uriProfileImage).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
profileImageRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
Uri downloadUrl = uri;
profileImageUrl = downloadUrl.toString();
Map messageMap = new HashMap();
messageMap.put("Message", profileImageUrl);
messageMap.put("Type", 2);
Map messageUserMap = new HashMap();
messageUserMap.put(user_ref+"/"+push_id,messageMap);
mRootRef.updateChildren(messageUserMap, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(@Nullable DatabaseError databaseError, @NonNull DatabaseReference databaseReference) {
if (databaseError!=null){
}
}
});
}
});
}
})
});
}
}
}
希望我清楚。任何帮助将不胜感激。
当用户选择他们要上传的图片时,您可以同时执行两个操作。首先,开始上传到存储,其次,获取图像并将其添加到您的视图中。
然后您可以立即向用户提供反馈并显示图像,而无需先往返于服务器。