Android - убийство не освобождает память? - PullRequest
0 голосов
/ 14 апреля 2019

Я работаю над приложением для Android. В моей деятельности у меня есть RecyclerView, а у recyclerview есть сотни элементов, в основном изображения и видео (но я показываю только миниатюру видео, а не загрузку видео).

В адаптере переработчика я переопределил метод onViewRecycled и удалил все изображения с помощью метода скольжения и других встроенных методов:

Glide.with(holder.itemView.getContext()).clear(holder.postimage);
        holder.postimage.setImageDrawable(null);
        holder.postimage.setImageBitmap(null);

Но когда я загружаю сотни элементов, память увеличивается и приложение сначала зависает (система показывает сообщение «приложение не отвечает»), а затем выдает ошибку OutOfMemory.

Я подумал: «Это происходит из-за повторного просмотра?» Затем я решил открыть ту же операцию, чтобы посмотреть, очистится ли память сама.

это мой код:

startActivity(new Intent(MainActivity.this,MainActivity.class));
            finish();
            Runtime.getRuntime().gc();

Даже если я убью свою предыдущую активность и вызову использование памяти сборщиком мусора на Android Profiler, оно не уменьшится, и приложение выдаст ошибку oom. Я также очищаю все списки, устанавливаю все ссылки на null и устанавливаю все слушатели равными null в методе ondestroy, но сборщик мусора ничего не делает?

Как я могу решить это?

Изображение Android Profiler: Android Profiler Image:

Изменить это моя домашняя страница

Все мои переменные являются глобальными:

Spinner spinner;
List<BasePost> list;
DatabaseReference reference;
FloatingActionButton fab;
SwipeRefreshLayout swipeRefreshLayout;
RecyclerView recyclerView;
private int yüklenen;
private boolean postson=false;
private LinearLayoutManager linearLayoutManager;
NRAdapter adapter;
private boolean loading=true;

И вот как я обычно настраиваю свою домашнюю страницу (я не добавляю весь код, только базовую структуру)

loading=true;
                spinner.setEnabled(false);
                swipeRefreshLayout.setRefreshing(true);
                yüklenen=0;
                postson=false;
                linearLayoutManager=null;
                adapter=null;
                list=null;
                reference=FirebaseDatabase.getInstance().getReference().child("posts").child(FirebaseAuth.getInstance().getUid());
                linearLayoutManager = new LinearLayoutManager(getContext());
                linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
                recyclerView.setLayoutManager(linearLayoutManager);
                list=new ArrayList<>();
                adapter = new NRAdapter();
                adapter.setHasStableIds(true);
                recyclerView.setAdapter(adapter);
                reference.limitToFirst(1).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        List<String> lo = new ArrayList<>();
                        for(DataSnapshot ds:dataSnapshot.getChildren()){
                            lo.add(ds.getKey());
                        }
                        if(lo.size()==0){
                            adapter.setContext(getContext(),list,"",reference);
                            list.add(new BasePost(null,null,"boş"));
                            adapter.notifyDataSetChanged();
                            postson=true;
                            swipeRefreshLayout.setRefreshing(false);
                            spinner.setEnabled(true);
                        }
                        else{
                            FirebaseDatabase.getInstance().getReference().child("admobadunitid").addListenerForSingleValueEvent(new ValueEventListener() {
                                @Override
                                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                    if(dataSnapshot.exists()){
                                        String admobadunitid=dataSnapshot.getValue().toString();
                                        adapter.setContext(getContext(),list,admobadunitid,reference);
                                        loaddata();
                                    }
                                }

                                @Override
                                public void onCancelled(@NonNull DatabaseError databaseError) {

                                }
                            });
                        }
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });

И вот как я загружаю свои данные. Я загружаю данные из интернета и использую firease в качестве базы данных. И, насколько я знаю, процесс извлечения данных из Firebase - asynctask

yüklenen=0;
    int eski= list.size();
    List<String> gecicilist=new ArrayList<>();
    List<BasePost> gecicilistbase=new ArrayList<>();
    reference.limitToLast(20).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for(DataSnapshot ds:dataSnapshot.getChildren()){
                gecicilist.add(ds.getKey());
            }
            Collections.reverse(gecicilist);
            for(int i=gecicilist.size();i>0;i--){
                if(içerikkontrol(list,gecicilist.get(i-1))){
                    gecicilist.remove(i-1);
                }
            }
            if(gecicilist.size()>0){
                for(int i=0;i<gecicilist.size();i++){
                    int finalI = i;
                    FirebaseDatabase.getInstance().getReference().child("postall").child(gecicilist.get(i)).child("info").addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            if(dataSnapshot.exists()){
                                BasePost basePost = new BasePost();
                                basePost.setPost(dataSnapshot.getValue(Post.class));
                                FirebaseDatabase.getInstance().getReference().child("users").child(basePost.getPost().getUid()).child("about").addListenerForSingleValueEvent(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                        basePost.setUser(dataSnapshot.getValue(User.class));
                                        basePost.setKey(gecicilist.get(finalI));
                                        yüklenen++;
                                        gecicilistbase.add(basePost);
                                        if(yüklenen==gecicilist.size()){
                                            yüklenen=0;
                                            for(int i=0;i<gecicilist.size();i++){
                                                if(list.size()!=0&&list.size()%6==0){
                                                    i--;
                                                    list.add(new BasePost(null,null,"reklam"));
                                                }
                                                else{
                                                    for(int m=0;m<gecicilistbase.size();m++){
                                                        if(gecicilistbase.get(m).getKey().equals(gecicilist.get(i))){
                                                            list.add(gecicilistbase.get(m));

                                                        }
                                                    }
                                                }

                                            }
                                            gecicilist.clear();
                                            if(gecicilistbase.size()==0){
                                                postson=true;

                                            }
                                            gecicilistbase.clear();
                                            if(list.size()==0){
                                                list.add(new BasePost(null,null,"boş"));
                                                postson=true;
                                            }

                                            swipeRefreshLayout.setRefreshing(false);
                                            adapter.notifyDataSetChanged();

                                            spinner.setEnabled(true);

                                            loading=false;
                                        }
                                    }

                                    @Override
                                    public void onCancelled(@NonNull DatabaseError databaseError) {

                                    }
                                });

                            }
                            else{
                                reference.child(gecicilist.get(finalI)).removeValue();
                                yüklenen++;
                                if(yüklenen==gecicilist.size()){
                                    yüklenen=0;
                                    for(int i=0;i<gecicilist.size();i++){
                                        if(list.size()!=0&&list.size()%6==0){
                                            i--;
                                            list.add(new BasePost(null,null,"reklam"));
                                        }
                                        else{
                                            for(int m=0;m<gecicilistbase.size();m++){
                                                if(gecicilistbase.get(m).getKey().equals(gecicilist.get(i))){
                                                    list.add(gecicilistbase.get(m));

                                                }
                                            }
                                        }

                                    }
                                    gecicilist.clear();
                                    if(gecicilistbase.size()==0){
                                        postson=true;
                                    }
                                    gecicilistbase.clear();
                                    if(list.size()==0){
                                        list.add(new BasePost(null,null,"boş"));
                                        postson=true;
                                    }

                                    swipeRefreshLayout.setRefreshing(false);
                                    adapter.notifyDataSetChanged();

                                    spinner.setEnabled(true);

                                    loading=false;
                                }
                            }
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {

                        }
                    });
                }
            }

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

1 Ответ

0 голосов
/ 14 апреля 2019

Как мы можем прочитать на странице документации Glide , нагрузки автоматически очищаются:

Хотя рекомендуется очищать грузы, которые вам больше не нужны, вы не обязаны это делать. Фактически, Glide автоматически очищает нагрузку и перезапускает любые ресурсы, используемые нагрузкой, когда действие или фрагмент, который вы передаете Glide.with (), уничтожается.

Это заставляет меня верить, что что-то еще идет не так. Трудно точно определить, что именно происходит, так как исходный код практически отсутствует. Может быть, вы можете предоставить нам более соответствующий исходный код.

...