如何将上传到Cloud Storage的图像调整为指定大小?

我在我的教授申请中使用RecyclerView,以查看学生名单上将有照片和其他详细信息以及删除选项的信息。我尽力做的所有事情。但是存在一个问题,即来自Firebase的照片无法加载到RecyclerView中。有时会加载一两张照片,然后停止加载照片。我正在加载应用程序时观察android Studio上的“运行”选项。然后我发现类似...

    W/art: Throwing OutOfMemoryError "Failed to allocate a 71663628 byte     allocation with 4188416 free bytes and 46MB until OOM"
    V/FA: Inactivity,disconnecting from the service

为什么这个问题发生在我身上,我真的还没明白。拜托,帮我摆脱这个问题。

寻找了很多之后,我尝试了一些步骤,这些步骤使缓存无效/重启。但这对我不起作用。

这是我RecyclerView的主要活动:

public class HRequestedStudents extends AppCompatactivity {
DatabaseReference databaseReference;
ProgressDialog progressDialog;
List<RegisteredStudent> list = new ArrayList<>();
RecyclerView recyclerView;
RecyclerView.Adapter adapter ;
RequestedStudents madapter;
RegisteredStudent registeredStudent;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_hrequested_students);
    recyclerView = (RecyclerView) findViewById(R.id.recycleView);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(HRequestedStudents.this));

    progressDialog = new ProgressDialog(HRequestedStudents.this);
    progressDialog.setMessage("Loading Data...");
    progressDialog.show();
    databaseReference = FirebaseDatabase.getInstance().getReference("RegisteredStudent");
    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull Datasnapshot snapshot) {
            list.clear();
            for (Datasnapshot datasnapshot : snapshot.getchildren()) {
                registeredStudent = datasnapshot.getvalue(RegisteredStudent.class);
                list.add(registeredStudent);
            }
            adapter = new RequestedStudents(HRequestedStudents.this,list);
            recyclerView.setadapter(adapter);
            progressDialog.dismiss();
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            progressDialog.dismiss();
        }
    });
}
}

这是我的适配器活动

public class RequestedStudents extends RecyclerView.Adapter<RequestedStudents.RecyclerViewHolder> {
private Context mContext;
ProgressDialog progressDialog;
List<RegisteredStudent> requestedStudents;
FirebaseStorage mFirebaseStorage = getInstance();
DatabaseReference mRef = FirebaseDatabase.getInstance().getReference("RegisteredStudent");

public RequestedStudents(Context context,List<RegisteredStudent> list) {
    mContext=context;
    requestedStudents = list;
}
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
    View view = LayoutInflater.from(mContext).inflate(R.layout.hrstudentlistitems,parent,false);
    return new RecyclerViewHolder(view);
}
@Override
public void onBindViewHolder(RecyclerViewHolder holder,int position) {
    RegisteredStudent currentStudentDetails = requestedStudents.get(position);
    holder.name.setText("Name: "+currentStudentDetails.getRegeName());
    holder.room.setText("Room: "+currentStudentDetails.getRegeRoom());
    holder.id.setText("ID: "+currentStudentDetails.getRegeID());
    holder.batch.setText("Batch: "+currentStudentDetails.getRegeBatch());
    holder.dept.setText("Department: "+currentStudentDetails.getRegeDept());
    holder.email = currentStudentDetails.getRegeEmail();
    holder.nam = currentStudentDetails.getRegeName();
    holder.rum = currentStudentDetails.getRegeRoom();
    holder.mobile = currentStudentDetails.getRegeMobile();
    holder.pass = currentStudentDetails.getRegePass();
    holder.iD = currentStudentDetails.getRegeID();
    holder.Batch = currentStudentDetails.getRegeID();
    holder.Dept = currentStudentDetails.getRegeDept();
    holder.imageUri = currentStudentDetails.getImageUri();
    Picasso.get().load(currentStudentDetails.getImageUri()).into(holder.profile_photo);
}

@Override
public int getItemCount() {
    return requestedStudents.size();
}
public class RecyclerViewHolder extends RecyclerView.ViewHolder {
    public TextView name,id,room,batch,dept;
    public String email,mobile,imageUri,pass,iD,nam,rum,uId,Batch,Dept;
    public CircleImageView profile_photo;
    public Button remove,accept;

    public RecyclerViewHolder(View item) {
        super(item);
        name = item.findViewById(R.id.name);
        room = item.findViewById(R.id.room);
        id = item.findViewById(R.id.id);
        batch = item.findViewById(R.id.batch);
        dept = item.findViewById(R.id.dept);
        profile_photo = item.findViewById(R.id.profile_photo);
        remove = item.findViewById(R.id.remove);
        accept = item.findViewById(R.id.accept);

        item.setOnClicklistener(new View.OnClicklistener() {
            @Override
            public void onClick(View v) {
                progressDialog = new ProgressDialog(mContext);
                progressDialog.setMessage("Please Wait...");
                progressDialog.show();
                LayoutInflater inflater = LayoutInflater.from(mContext);
                View view = inflater.inflate(R.layout.student_bistarito,null);

                CircleImageView imagebi = view.findViewById(R.id.imagebi);
                TextView nambi = view.findViewById(R.id.nambi);
                TextView rumbi = view.findViewById(R.id.rumbi);
                Button call = view.findViewById(R.id.call);
                Button cancel = view.findViewById(R.id.cancel);

                final AlertDialog alertDialog = new AlertDialog.Builder(mContext).create();
                nambi.setText("Name: " + nam);
                rumbi.setText("Room: " + rum);
                Picasso.get().load(imageUri).into(imagebi);
                progressDialog.dismiss();

                uId = FirebaseAuth.getInstance().getUid();


                call.setOnClicklistener(new View.OnClicklistener() {
                    @Override
                    public void onClick(View v) {
                        Intent i = new Intent(Intent.actION_CALL);
                        i.setData(Uri.parse("tel:" + mobile));
                        if (ContextCompat.checkSelfPermission(mContext,CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
                            mContext.startactivity(i);
                        } else {
                            Toast.makeText(mContext,"Go to settings and allow call permission",Toast.LENGTH_LONG).show();
                        }
                        alertDialog.dismiss();
                    }
                });
                cancel.setOnClicklistener(new View.OnClicklistener() {
                    @Override
                    public void onClick(View v) {
                        try {
                            Toast.makeText(mContext,"Shubho",Toast.LENGTH_SHORT).show();
                        } catch (Exception e) {
                            Toast.makeText(mContext,e.getMessage(),Toast.LENGTH_LONG).show();
                        }
                        alertDialog.dismiss();
                    }
                });
                alertDialog.setView(view);
                alertDialog.show();
                alertDialog.getWindow().setBackgroundDrawable(null);
            }
        });
        profile_photo.setOnClicklistener(new View.OnClicklistener() {
            @Override
            public void onClick(View v) {
                LayoutInflater inflater = LayoutInflater.from(mContext);
                View vi = inflater.inflate(R.layout.activity_photo,null);
                ImageView photo = vi.findViewById(R.id.image);
                Button close = vi.findViewById(R.id.close);
                final AlertDialog ad = new AlertDialog.Builder(mContext).create();
                Picasso.get().load(imageUri).into(photo);
                close.setOnClicklistener(new View.OnClicklistener() {
                    @Override
                    public void onClick(View v) {
                        ad.dismiss();
                    }
                });
                ad.setView(vi);
                ad.show();
                ad.getWindow().setBackgroundDrawable(null);
            }
        });
        accept.setOnClicklistener(new View.OnClicklistener() {
            @Override
            public void onClick(View v) {

            }
        });
        remove.setOnClicklistener(new View.OnClicklistener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
                builder.setTitle("Delete");
                builder.setMessage("Are you sure to remove this student?");
                builder.setPositiveButton("Yes",new DialogInterface.OnClicklistener() {
                    @Override
                    public void onClick(DialogInterface dialog,int which) {
                        try {
                            Query query = mRef.orderByChild("email").equalTo(email);
                            query.addListenerForSingleValueEvent(new ValueEventListener() {
                                @Override
                                public void onDataChange(@NonNull Datasnapshot datasnapshot) {
                                    for (Datasnapshot ds : datasnapshot.getchildren()) {
                                        ds.getRef().removeValue();
                                    }
                                    Toast.makeText(mContext,"Removed Successfully!",Toast.LENGTH_SHORT).show();
                                }

                                @Override
                                public void onCancelled(@NonNull DatabaseError databaseError) {
                                    Toast.makeText(mContext,databaseError.getMessage(),Toast.LENGTH_SHORT).show();
                                }
                            });
                            StorageReference mPictureReferance = getInstance().getReferenceFromUrl(imageUri);
                            mPictureReferance.delete().addOnSuccessListener(new OnSuccessListener<Void>() {
                                @Override
                                public void onSuccess(Void aVoid) {
                                    Toast.makeText(mContext,Toast.LENGTH_SHORT).show();
                                }
                            }).addOnFailureListener(new OnFailureListener() {
                                @Override
                                public void onFailure(@NonNull Exception e) {
                                    Toast.makeText(mContext,Toast.LENGTH_SHORT).show();
                                }
                            });

                        } catch (Exception e) {
                            Toast.makeText(mContext,Toast.LENGTH_LONG).show();
                        }
                    }
                });
                builder.setNegativeButton("Cancel",int which) {
                        dialog.dismiss();
                    }
                });
                builder.create().show();
            }
        });
    }
}
}

我想将所有图像加载到RecyclerView中,而不会出现错误行“不活动,正在与服务断开连接”。我该怎么解决?

keainono11 回答:如何将上传到Cloud Storage的图像调整为指定大小?

您看到的错误表明图像尺寸很大。

您可以做的是

  1. 在将照片上传到Firebase时,您可以压缩照片尺寸然后上传。这样,当您的android appFirebase获取照片时,图像尺寸会减小,并且可以轻松分配。

  2. 您可以使用参考https://developer.android.com/topic/performance/graphics/load-bitmap将大型或大型图像有效地加载到android中。

首先将被视为每个人的做法。由于Firebase的存储空间将被减少使用,并且用户可以在App中轻松下载图像,而不会遇到任何Lagmemory问题。

,

我能想到的最佳解决方案是使用Resize Images Extension

  

将上传到Cloud Storage的图像调整为指定大小,并存储原始图像和调整后的图像。

这里是Github repo

本文链接:https://www.f2er.com/3130108.html

大家都在问