Android - 杀戮活动不释放内存?

问题描述 投票:0回答:1

我正在研究一个Android应用程序。在我的活动中,我有一个RecyclerView和recyclerview有数百个项目,主要是图像和视频(但我只显示视频缩略图不加载视频)。

在recyclerview适配器中,我重写了ViewRecycled方法并使用glide clear方法和其他本机方法清除所有图像:

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

但当ı加载数百项内存增加和应用程序首先冻结(系统显示“应用程序没有响应”消息)然后它抛出OutOfMemory错误。

我想知道“这是否因为recyclerview而发生”然后我决定打开同样的活动,看看内存是否能清理干净。

这是我的代码:

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

即使我杀了我以前的活动并且在Android Profiler上调用垃圾收集器内存使用不会降低并且app会引发错误。我也清除所有列表设置所有引用null并在ondestroy方法上设置所有侦听器null但垃圾收集器不做任何事情?

我怎么解决这个问题?

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) {

                    }
                });

这就是我加载数据的方式。我从互联网上下载数据,并使用firebase作为数据库。据我所知,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) {

        }
    });
android memory android-activity memory-management out-of-memory
1个回答
0
投票

正如我们可以在Glide documentation page上看到的那样,负载会自动清除:

尽管清除不再需要的负载是一种很好的做法,但您不需要这样做。实际上,当您传入Glide.with()的Activity或Fragment被销毁时,Glide将自动清除负载并回收负载使用的任何资源。

这让我相信别的东西出了问题。很难确定究竟发生了什么,因为没有提供任何源代码。也许您可以为我们提供更相关的源代码。

© www.soinside.com 2019 - 2024. All rights reserved.