Android Studio Firebase内存泄漏

时间:2018-05-08 19:39:07

标签: java android firebase firebase-realtime-database firebaseui

我目前正在开发一个使用Firebase的简单社交媒体应用。用户将收到包含图片的帖子供稿,他的个人资料图片将显示在屏幕的一角以及我创建的设置活动中。

除了OOM(Out of Memory Exception)之外,该应用程序运行良好。切换活动几分钟后,图像将停止加载。我相信这是由我的应用程序中的内存泄漏引起的。我查看了android profiler,每次加载图像时它都会显示我的记忆力越来越稳定。

我已经坚持了很长一段时间,我真的非常需要一些帮助。如果只能在短时间内显示图像,我的应用程序将无法正常工作。这是我的代码,请有人帮忙:

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

}

摇篮:

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'

有一个较新的库,但到目前为止我已使用这些编写了我的应用程序。

1 个答案:

答案 0 :(得分:0)

添加事件侦听器而不再在不再需要时删除它们会随着时间的推移而出现问题。

在您的特定情况下,您不会在不再需要时删除侦听器,因此它会继续接收在其侦听位置发生的更改。在您的情况下,这也意味着Picasso也将继续加载图片。

每次添加像你这样的监听器而不删除它时,所有以前的监听器都将仍然收到结果并下载图像。重复这么多次,将很快消耗用户设备上的可用带宽。

始终确保删除您不再需要的侦听器:

firebaseRecyclerAdapter.cleanup();

您还可以通过 post 查看我的回答。