Image taking long time to upload using Firebase Android?

571 views Asked by At

Code to upload image using Firebase:

    Button btnUpload = (Button)findViewById(R.id.btn_upload_image);
        btnUpload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.setType("image/jpeg");
                intent.putExtra(Intent.EXTRA_LOCAL_ONLY,true);
                startActivityForResult(Intent.createChooser(intent,getString(R.string.str_complete_action)),RC_PHOTO_PICKER);
            }
        });

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
 if(requestCode == RC_PHOTO_PICKER && resultCode == RESULT_OK)
        {
            pbLoader.setVisibility(View.VISIBLE);
            Uri selectedImageUri = data.getData();
            StorageReference photoReference = mStorageReference.child(getString(R.string.str_images)+selectedImageUri.getLastPathSegment());
            photoReference.putFile(selectedImageUri).addOnSuccessListener(this, new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    Uri downloadUri = taskSnapshot.getDownloadUrl();
                    MessageModelClass messageModelClass = new MessageModelClass();
                    messageModelClass.setImageUrl(downloadUri.toString());
                    messageModelClass.setmMessage(null);
                    messageModelClass.setmUserName(userName);
                    mDatabaseReference.push().setValue(messageModelClass);
                    messageAdapter.notifyDataSetChanged();
                }
            }).addOnFailureListener(this, new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.d(TAG,"onFailure:"+e.getMessage());
                }
            }).addOnCompleteListener(this, new OnCompleteListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
                   // messageAdapter.notifyDataSetChanged();
                    pbLoader.setVisibility(View.GONE);
                    Log.d(TAG,"onComplete:");
                }
            });
        }

In process of sending message whenever i am sending any text its displaying in my recycler twice if 3 images are in pending and i am sending some text then text is being displayed thrice in recyclerview while its only showing data insert once in firebase console. when i restart app again then its showing exact no of messages. What is the reason of showing text or images multiple times?

Recyclercode :

private void initRecyclerView() {
        LinearLayoutManager layoutManager = new LinearLayoutManager(context);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        rvMessage.setLayoutManager(layoutManager);
        messageList = new ArrayList<>();
        messageList.clear();
        messageAdapter = new MessageAdapter(context, messageList , userName ,confirmationDialogListener);
        rvMessage.setAdapter(messageAdapter);
        messageAdapter.notifyDataSetChanged();
    }

 @Override
    public void onBindViewHolder(final MessageAdapter.MyViewHolder holder, final int position) {
       final MessageModelClass messageModelClass = messageModelList.get(position);
        if (messageModelClass.getmTimeDate() != null) {
            setTimeFormatInUI(messageModelClass.getmTimeDate(), holder);
        }
        if (messageModelClass.getImageUrl() != null) {
            holder.tvMessage.setVisibility(View.GONE);
            holder.ivPhoto.setVisibility(View.VISIBLE);
            holder.ivPhoto.setTag(messageModelClass.getmKey());
            Picasso.with(context).load(messageModelClass.getImageUrl()).into(holder.ivPhoto);
        } else {
            holder.ivPhoto.setVisibility(View.GONE);
            holder.tvMessage.setVisibility(View.VISIBLE);
            holder.tvMessage.setTag(messageModelClass.getmKey());
            holder.tvMessage.setText(messageModelClass.getmMessage());
        }
        if(messageModelClass.getmUserName() != null)
        {
                    if(userName.equals(messageModelClass.getmUserName()))
                    {
                        holder.tvUserName.setText("You");
                    }
                    else
                    {
                        holder.tvUserName.setText(messageModelClass.getmUserName());
                    }
        }
    }

code for chileEventListener :

private FirebaseDatabase mFirebaseDatabase;
private DatabaseReference mDatabaseReference; 
 mFirebaseDatabase = FirebaseDatabase.getInstance();
        mDatabaseReference = mFirebaseDatabase.getReference().child(getString(R.string.str_messages));
private void attachDatabaseReadListener() {
        Log.d(TAG,"attachDatabaseReadListener:");
        mChildEventListener = new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                MessageModelClass messageModelClass = dataSnapshot.getValue(MessageModelClass.class);
                messageModelClass.setmKey(dataSnapshot.getKey());
                messageList.add(messageModelClass);
                messageAdapter = new MessageAdapter(context, messageList , userName ,confirmationDialogListener);
                rvMessage.setAdapter(messageAdapter);
                Log.d(TAG,"message list size onChildAdded:"+messageList.size());
               // messageAdapter.notifyDataSetChanged();
            }

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

            }
        };
        mDatabaseReference.addChildEventListener(mChildEventListener);
    }
2

There are 2 answers

5
Sagar Patil On

Change your onBindViewHolder() as below. Then it will solve your issue.

@Override
public void onBindViewHolder(final MessageAdapter.MyViewHolder holder, final int position) {
   final MessageModelClass messageModelClass = messageModelList.get(position);
   if(messageModelClass !=null)
   {
     if (messageModelClass.getmTimeDate() != null) {
        setTimeFormatInUI(messageModelClass.getmTimeDate(), holder);
     }
     if (messageModelClass.getImageUrl() != null) {
        holder.tvMessage.setVisibility(View.GONE);
        holder.ivPhoto.setVisibility(View.VISIBLE);
        holder.ivPhoto.setTag(messageModelClass.getmKey());
            Picasso.with(context).load(messageModelClass.getImageUrl()).into(holder.ivPhoto);
    } else {
        holder.ivPhoto.setVisibility(View.GONE);
        holder.tvMessage.setVisibility(View.VISIBLE);
        holder.tvMessage.setTag(messageModelClass.getmKey());
        holder.tvMessage.setText(messageModelClass.getmMessage());
    }
    if(messageModelClass.getmUserName() != null)
    {
                if(userName.equals(messageModelClass.getmUserName()))
                {
                    holder.tvUserName.setText("You");
                }
                else
                {
                    holder.tvUserName.setText(messageModelClass.getmUserName());
                }
   }
   else
   {
     //set all your holer element to visibility gone
     //eg. holder.tvUserName.setVisibility(View.GONE);
   }

}
4
Abhishek Singh On

chenge you code like this. cause you set the adapter before the only you need to notifyItemInserted do not set adpter again..

@Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            MessageModelClass messageModelClass = dataSnapshot.getValue(MessageModelClass.class);
            messageModelClass.setmKey(dataSnapshot.getKey());
            messageList.add(messageModelClass);

           messageAdapter.notifyItemInserted(messageList.size()-1);
        }