如何解决导致内存不足并导致我的应用崩溃的泄漏?

时间:2019-12-24 16:01:45

标签: android firebase android-fragments firebase-realtime-database memory-leaks

我有应用程序通过Firebase Realtime Database获取数据,我的接收没有问题,但是泄漏很大。我的应用程序显示了15条内容,如帖子(包含图片和说明),然后按时显示更多信息,我清除帖子列表并从firebase中获取下一个数据并显示新的15条内容,当我致电HomeFragment.jave时总是会发生什么发生泄漏,由于泄漏会向RAM中添加更多30-40 MB!

我使用LeakCanary和Profiler View来检测泄漏并解决它...我们尝试了一些方法来处理泄漏 但是泄漏仍然... 此图显示了通过泄漏Canary工具实现的泄漏 HomeFragment Leak By LeakCanary 这张图显示了Profiler中我的应用程序的RAM图表 My Ram Leak By android Profiler

这是我的代码:

  1. HomeFragment

HomeFragment

public class HomeFragment extends Fragment {
private RecyclerView recyclerView;


private Random random=new Random();
public int RandomNummber;
public int PostsLength1;
public int PostsLength;
public int[]ListRandomNumbers=new int[PostsLength1];

private PostAdapter postAdapter;
public List<Post> postList;
private RecyclerView recyclerView_story;
private StoryAdapter storyAdapter;
private List<Story> storyList;
private ImageView log,search1234;
private List<String> followingList;

public int pointer=0;
ProgressBar progress_circular;
public ImageButton sendbt;
public TextView btnloadmore;



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_home, container, false);


    recyclerView = view.findViewById(R.id.recycler_view);
    recyclerView.setHasFixedSize(true);
    LinearLayoutManager mLayoutManager = new LinearLayoutManager(getContext());
    mLayoutManager.setReverseLayout(true);
    mLayoutManager.setStackFromEnd(true);
    recyclerView.setLayoutManager(mLayoutManager);

    ///////////////////////////////////////////////
    postList = new ArrayList<>();
    postAdapter = new PostAdapter(getContext(), postList );
    ///////////////////////////////////////////////

    recyclerView.setAdapter(postAdapter);
    log=view.findViewById( R.id.logo );
    recyclerView_story = view.findViewById(R.id.recycler_view_story);
    recyclerView_story.setHasFixedSize(true);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext(),
            LinearLayoutManager.HORIZONTAL, false);
    recyclerView_story.setLayoutManager(linearLayoutManager);
    storyList = new ArrayList<>();
    storyAdapter = new StoryAdapter(getContext(), storyList);
    recyclerView_story.setAdapter(storyAdapter);
    sendbt=view.findViewById( R.id.masseag );
    progress_circular = view.findViewById(R.id.progress_circular);
    search1234=view.findViewById( R.id.search123 );
    btnloadmore=view.findViewById(R.id.id_loadmore);


    takefirst15items();

    checkFollowing();

    btnloadmore.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            alkaharfunction();
        }
    });

    search1234.setOnClickListener( new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity( new Intent( getContext(), SearchInHomeFragment.class ) );
        }
    } );



    sendbt.setOnClickListener( new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(getContext(), ChatActivity.class));
        }
    } );


    return view;
}

@Override
public void onDestroyView() {
    Toast.makeText(getContext(), "!!!!!!!!!!!!!!!!!!!!", Toast.LENGTH_SHORT ).show();
    recyclerView.setAdapter(null);

    postList.clear();
    super.onDestroyView();
}

private void takefirst15items(){

    final DatabaseReference referenceRRR=FirebaseDatabase.getInstance().getReference().child("PostsLength");

    referenceRRR.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            if (dataSnapshot.exists()){

                String st= dataSnapshot.getValue().toString();
                PostsLength = Integer.parseInt(st);
                READPOSTS();


            }else Toast.makeText(getContext(), "Not Found The Value of PostsLength", Toast.LENGTH_SHORT).show();
        }

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

        }
    });
}

private void alkaharfunction(){

    pointer++;
    progress_circular.setVisibility(View.VISIBLE);
    int index=postList.size()*pointer , end=index+15;
    String CHILD="";
    postList.clear();
    final DatabaseReference reff=FirebaseDatabase.getInstance().getReference().child("Posts");

    for (int i=index;i<end;i++){
        if (i<PostsLength) {
            CHILD = "" + ListRandomNumbers[i];

            reff.child(CHILD).addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                    if (dataSnapshot.exists()) {
                        Post post = dataSnapshot.getValue(Post.class);
                        postList.add(post);

                    }
                    postAdapter.notifyDataSetChanged();
                }

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

                }
            });
            postAdapter.notifyDataSetChanged();
            progress_circular.setVisibility(View.GONE);
        }
        else { pointer=0; }

    }



}

private void checkFollowing(){
    followingList = new ArrayList<>();
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Follow")
            .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
            .child("following");

    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            followingList.clear();
            for (DataSnapshot snapshot : dataSnapshot.getChildren()){
                followingList.add(snapshot.getKey());
            }

            //readPosts();
            readStory();

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

private void READPOSTS(){

    int x=0;
    String CHILD="";

    InitialArray();

    final DatabaseReference reff=FirebaseDatabase.getInstance().getReference().child("Posts");

    for (int i=0;i<15;i++){

        CHILD=""+ListRandomNumbers[x];

        reff.child(CHILD).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                if (dataSnapshot.exists()){
                    Post post = dataSnapshot.getValue(Post.class);
                    postList.add(post);

                }// else Toast.makeText(getContext(), "Dont Found The Value", Toast.LENGTH_SHORT).show();

                postAdapter.notifyDataSetChanged();
                progress_circular.setVisibility( View.GONE );
            }

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

            }
        });

        x++;
    }

}



private void InitialArray() {

    Random r =new Random();
    int[] arr=new int[PostsLength];

    int tmp;
    for (int i=0;i<arr.length;i++){

        tmp=r.nextInt(PostsLength+1);
        while (IsDup(tmp ,arr)){

            tmp=r.nextInt(PostsLength+1);

        }
        arr[i]=tmp;
    }

    ListRandomNumbers=new int[PostsLength];


    // To Save The All Random Numbers in Array
    for (int i=0;i<arr.length;i++){
        ListRandomNumbers[i]=arr[i];

    }
}

private boolean IsDup(int tmp, int[] arr) {

    for (int j=0;j<arr.length;j++){
        if (arr[j]==tmp){
            return true;
        }
    }
    return false;
}

private void readPosts(){

    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Posts");

    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
           // postList.clear();
            for (DataSnapshot snapshot : dataSnapshot.getChildren()){
                Post post = snapshot.getValue(Post.class);
               // for (String id : followingList){
                   // if (post.getPublisher().equals(id)){
                        postList.add(post);
                   // }
               // }
            }

            postAdapter.notifyDataSetChanged();
            progress_circular.setVisibility(View.GONE);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}



private void readBazzarPagePosts(){
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference( ).child( "Bazzar_Page_Posts" ).child( "Post_Information" );

    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            postList.clear();
            for (DataSnapshot snapshot : dataSnapshot.getChildren()){
               if (snapshot.exists()){
                   Post post = snapshot.getValue(Post.class);
                   postList.add(post);
               }
            }

            postAdapter.notifyDataSetChanged();
            progress_circular.setVisibility(View.GONE);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

private void readStory(){
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Story");
    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            long timecurrent = System.currentTimeMillis();
            storyList.clear();
            storyList.add(new Story("", 0, 0, "",
                    FirebaseAuth.getInstance().getCurrentUser().getUid()));
            for (String id : followingList) {
                int countStory = 0;
                Story story = null;
                for (DataSnapshot snapshot : dataSnapshot.child(id).getChildren()) {
                    story = snapshot.getValue(Story.class);
                    if (timecurrent > story.getTimestart() && timecurrent < story.getTimeend()) {
                        countStory++;
                    }
                }
                if (countStory > 0){
                    storyList.add(story);
                }
            }

            storyAdapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}
}
  1. PostAdapter

PostAdapter文件:- PostAdater.jave

0 个答案:

没有答案