Android Studio Firebase 内存泄漏
Android Studio Firebase Memory Leak
我目前正在开发一个使用 Firebase 的简单社交媒体应用程序。用户将收到包含图片的帖子供稿,他的个人资料图片将显示在屏幕的一角和设置中 activity 我创建的。
除了 OOM(内存不足异常)之外,该应用程序运行良好。切换活动几分钟后,图像将停止加载。我相信这是由我的应用程序中的内存泄漏引起的。我查看了 android 分析器,它显示我的记忆在每次加载图像时都越来越稳定。
我已经坚持了很长一段时间,我真的非常需要一些帮助。如果我的应用程序只能短时间显示图像,它将无法运行。这是我的代码,请有人帮忙:
private void DisplayUserPostsToLayout() {
final FirebaseRecyclerAdapter<postsGetInfo,postsGetInfoViewHolder> firebaseRecyclerAdapter =
new FirebaseRecyclerAdapter<postsGetInfo, postsGetInfoViewHolder>(postsGetInfo.class, R.layout.posts_layout,postsGetInfoViewHolder.class,postRef) {
@Override
protected void populateViewHolder(final postsGetInfoViewHolder viewHolder, postsGetInfo model, int position) {
final String postKey = getRef(position).getKey();
viewHolder.setUsername(model.getUsername());
viewHolder.setTime(model.getTime());
viewHolder.setDate(model.getDate());
viewHolder.setDescription(model.getDescription());
viewHolder.setProfileImage(model.getProfileimage());
viewHolder.setImage(model.getImage());
viewHolder.myView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent editIntent = new Intent((getActivity()),postEdit.class);
editIntent.putExtra("PostKey",postKey);
startActivity(editIntent);
}
});
}
};
postList.setAdapter(firebaseRecyclerAdapter);
}
public static class postsGetInfoViewHolder extends RecyclerView.ViewHolder {
View myView;
public postsGetInfoViewHolder(View itemView) {
super(itemView);
myView = itemView;
}
/**/public void setUsername(String username){
TextView Username = (TextView) myView.findViewById(R.id.txtName);
Username.setText(username);
}
public void setProfileImage(String profileImage){
CircularImageView profile = (CircularImageView) myView.findViewById(R.id.profileImage);
Picasso.get().load(profileImage).placeholder(R.drawable.ic_wifi).into(profile);
}
public void setTime(String time){
TextView postTime = (TextView) myView.findViewById(R.id.txtTime);
postTime.setText(time);
}
public void setDate(String date){
TextView postDate = (TextView) myView.findViewById(R.id.txtDate);
postDate.setText(date);
}
public void setDescription(String description){
TextView postDescription = (TextView) myView.findViewById(R.id.txtSurname);
postDescription.setText(description);
}
/**/ public void setImage(String image){
ImageView postImage = (ImageView) myView.findViewById(R.id.imgPost);
Picasso.get().load(image).placeholder(R.drawable.ic_wifi).into(postImage);
}
}
Gradle:
implementation 'com.google.firebase:firebase-auth:11.0.2'
implementation 'com.google.firebase:firebase-database:11.0.2'
implementation 'com.google.firebase:firebase-storage:11.0.2'
implementation 'com.google.android.gms:play-services-auth:11.0.2'
implementation 'com.firebaseui:firebase-ui-database:2.1.1'
有一个更新的库,但到目前为止我已经使用这些库编写了我的应用程序。
在不再需要时添加事件侦听器而不删除它们,随着时间的推移会导致问题。
在您的特定情况下,您不会在不再需要时删除侦听器,因此它会继续接收在其侦听位置发生的更改。在您的情况下,这也意味着 Picasso
也将继续加载图像。
每次您添加像您这样的监听器而不删除它时,所有先前的监听器都将仍然接收结果并下载图像。重复此操作多次,将快速消耗用户设备上的可用带宽。
始终确保删除不再需要的侦听器,如下所示:
firebaseRecyclerAdapter.cleanup();
你也可以从这个 .
看看我的回答
我目前正在开发一个使用 Firebase 的简单社交媒体应用程序。用户将收到包含图片的帖子供稿,他的个人资料图片将显示在屏幕的一角和设置中 activity 我创建的。
除了 OOM(内存不足异常)之外,该应用程序运行良好。切换活动几分钟后,图像将停止加载。我相信这是由我的应用程序中的内存泄漏引起的。我查看了 android 分析器,它显示我的记忆在每次加载图像时都越来越稳定。
我已经坚持了很长一段时间,我真的非常需要一些帮助。如果我的应用程序只能短时间显示图像,它将无法运行。这是我的代码,请有人帮忙:
private void DisplayUserPostsToLayout() {
final FirebaseRecyclerAdapter<postsGetInfo,postsGetInfoViewHolder> firebaseRecyclerAdapter =
new FirebaseRecyclerAdapter<postsGetInfo, postsGetInfoViewHolder>(postsGetInfo.class, R.layout.posts_layout,postsGetInfoViewHolder.class,postRef) {
@Override
protected void populateViewHolder(final postsGetInfoViewHolder viewHolder, postsGetInfo model, int position) {
final String postKey = getRef(position).getKey();
viewHolder.setUsername(model.getUsername());
viewHolder.setTime(model.getTime());
viewHolder.setDate(model.getDate());
viewHolder.setDescription(model.getDescription());
viewHolder.setProfileImage(model.getProfileimage());
viewHolder.setImage(model.getImage());
viewHolder.myView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent editIntent = new Intent((getActivity()),postEdit.class);
editIntent.putExtra("PostKey",postKey);
startActivity(editIntent);
}
});
}
};
postList.setAdapter(firebaseRecyclerAdapter);
}
public static class postsGetInfoViewHolder extends RecyclerView.ViewHolder {
View myView;
public postsGetInfoViewHolder(View itemView) {
super(itemView);
myView = itemView;
}
/**/public void setUsername(String username){
TextView Username = (TextView) myView.findViewById(R.id.txtName);
Username.setText(username);
}
public void setProfileImage(String profileImage){
CircularImageView profile = (CircularImageView) myView.findViewById(R.id.profileImage);
Picasso.get().load(profileImage).placeholder(R.drawable.ic_wifi).into(profile);
}
public void setTime(String time){
TextView postTime = (TextView) myView.findViewById(R.id.txtTime);
postTime.setText(time);
}
public void setDate(String date){
TextView postDate = (TextView) myView.findViewById(R.id.txtDate);
postDate.setText(date);
}
public void setDescription(String description){
TextView postDescription = (TextView) myView.findViewById(R.id.txtSurname);
postDescription.setText(description);
}
/**/ public void setImage(String image){
ImageView postImage = (ImageView) myView.findViewById(R.id.imgPost);
Picasso.get().load(image).placeholder(R.drawable.ic_wifi).into(postImage);
}
}
Gradle:
implementation 'com.google.firebase:firebase-auth:11.0.2'
implementation 'com.google.firebase:firebase-database:11.0.2'
implementation 'com.google.firebase:firebase-storage:11.0.2'
implementation 'com.google.android.gms:play-services-auth:11.0.2'
implementation 'com.firebaseui:firebase-ui-database:2.1.1'
有一个更新的库,但到目前为止我已经使用这些库编写了我的应用程序。
在不再需要时添加事件侦听器而不删除它们,随着时间的推移会导致问题。
在您的特定情况下,您不会在不再需要时删除侦听器,因此它会继续接收在其侦听位置发生的更改。在您的情况下,这也意味着 Picasso
也将继续加载图像。
每次您添加像您这样的监听器而不删除它时,所有先前的监听器都将仍然接收结果并下载图像。重复此操作多次,将快速消耗用户设备上的可用带宽。
始终确保删除不再需要的侦听器,如下所示:
firebaseRecyclerAdapter.cleanup();
你也可以从这个