我有应用程序通过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
这是我的代码:
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) {
}
});
}
}
PostAdapter文件:- PostAdater.jave