Утечка памяти в Android Studio Firebase - PullRequest
0 голосов
/ 08 мая 2018

В настоящее время я занимаюсь разработкой простого приложения для социальных сетей, в котором используется Firebase. Пользователь получит фид постов, содержащих изображения, его изображение профиля будет отображаться в углу экрана и в настройке активности, которую я создал.

Приложение работает отлично, кроме OOM (Exception of Memory Exception). После нескольких минут переключения изображения перестают загружаться. Я считаю, что это вызвано утечками памяти в моем приложении. Я просмотрел профилировщик андроида, и он все время стабильно показывал мою память при каждой загрузке изображения.

Я застрял на этом довольно долго, и мне очень нужна помощь. Мое приложение не будет работать, если оно может отображать изображения только в течение короткого периода времени. Вот мой код, пожалуйста, кто-то может помочь:

 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'

Существует более новая библиотека, но я уже кодировал свое приложение, используя их.

1 Ответ

0 голосов
/ 09 мая 2018

Добавление прослушивателей событий без их удаления, когда они больше не нужны, со временем вызовет проблемы.

В вашем конкретном случае вы не удаляете слушателя, когда он больше не нужен, поэтому он продолжает получать изменения, которые происходят в том месте, где он слушает. В вашем случае это также означает, что Picasso продолжит загружать изображения.

Каждый раз, когда вы добавляете слушателя, подобного вашему, без его удаления, все предыдущие слушатели все равно будут получать результаты и загружать изображения. Повторяя это много раз, вы быстро будете использовать доступную полосу пропускания на устройстве пользователя.

Всегда обязательно удаляйте слушателей, которые вам больше не нужны, вот так:

firebaseRecyclerAdapter.cleanup();

Вы также можете посмотреть на мой ответ из этого сообщения .

...