用户离线时如何发送图像,就像带有Firebase的聊天应用中的短信一样?

时间:2018-08-02 14:40:12

标签: android firebase firebase-realtime-database firebase-storage android-adapter

因此,firebase具有此脱机功能。

因此,每当我发送任何短信时,只要单击“发送”,它就会立即显示在设备上。它像一种魅力。

我的问题是,当我尝试发送图像时,它不会发生相同的情况。即使当我在线时,该图像也将首先上传到Firebase Storage。然后,图像网址将被存储到firebase-database。之后,它显示给我。这需要时间,具体取决于文件大小。发送并在后台进行上传后,是否可以在设备上立即显示图像?

我有一个适配器类,并在recyclerView中检索数据。

这是我向视图添加图像的方式(这在适配器类中):

@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;
    }
}

这是我的上传方式(这在“聊天活动”类中):

@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){

                                    }
                                }
                            });
                        }
                    });
                }
            })

                    });
        }


    }
}

希望我很清楚。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

当用户选择要上传的图像时,您可以同时执行两个操作。首先,开始上传到存储,其次,获取图像并将其添加到视图中。

然后,您可以立即向用户提供反馈并显示图像,而无需先往返服务器。